Cara mendapatkan nilai properti berdasarkan nama

148

apakah ada cara untuk mendapatkan nilai properti objek berdasarkan namanya?

Sebagai contoh jika saya punya:

public class Car : Vehicle
{
   public string Make { get; set; }
}

dan

var car = new Car { Make="Ford" };

Saya ingin menulis metode di mana saya bisa memasukkan nama properti dan itu akan mengembalikan nilai properti. yaitu:

public string GetPropertyValue(string propertyName)
{
   return the value of the property;
}
Coder 2
sumber

Jawaban:

311
return car.GetType().GetProperty(propertyName).GetValue(car, null);
Matt Greer
sumber
17
Perlu diingat bahwa karena ini menggunakan refleksi, itu jauh lebih lambat. Mungkin bukan masalah, tapi bagus untuk diperhatikan.
Matt Greer
"Tidak dapat mengonversi dari String ke BindingFlags"
Christine
5
Apakah ada cara "lebih cepat" @MattGreer?
FizxMike
44

Anda harus menggunakan refleksi

public object GetPropertyValue(object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

Jika Anda ingin benar-benar mewah, Anda bisa menjadikannya metode ekstensi:

public static object GetPropertyValue(this object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

Lalu:

string makeValue = (string)car.GetPropertyValue("Make");
Adam Rackis
sumber
Anda ingin GetValue bukannya SetValue
Matt Greer
dapatkah saya melakukan ini juga untuk SetValue? bagaimana?
Piero Alberto
1
metode ekstensi hal kecil mungkin tidak perlu memiliki variabel bernamacar
KyleMit
Untuk melihat cara mengatur nilai properti, berdasarkan string propertyName, lihat jawabannya di sini: Mengatur nilai properti melalui refleksi
nwsmith
35

Anda ingin Refleksi

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);
Chuck Savage
sumber
7
+1 Ini adalah jawaban terbaik karena Anda menunjukkan semua objek perantara
Matt Greer
1
Alih-alih melewati nilai properti, bisakah saya melewati indeks dan mendapatkan nama dan nilai properti (jadi saya bisa mengulang semua properti)?
singhswat
@singhswat Anda harus menanyakan itu sebagai pertanyaan baru.
Chuck Savage
7

Sampel sederhana (tanpa menulis kode keras refleksi di klien)

class Customer
{
    public string CustomerName { get; set; }
    public string Address { get; set; }
    // approach here
    public string GetPropertyValue(string propertyName)
    {
        try
        {
            return this.GetType().GetProperty(propertyName).GetValue(this, null) as string;
        }
        catch { return null; }
    }
}
//use sample
static void Main(string[] args)
    {
        var customer = new Customer { CustomerName = "Harvey Triana", Address = "Something..." };
        Console.WriteLine(customer.GetPropertyValue("CustomerName"));
    }
Harveyt
sumber
7

Selain itu, orang lain menjawab, itu Mudah untuk mendapatkan nilai properti dari objek apa pun dengan menggunakan metode Extension seperti:

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }

    }

Penggunaannya adalah:

Car foo = new Car();
var balbal = foo.GetPropertyValue("Make");
Ali
sumber
7

Memperluas jawaban Adam Rackis - kita dapat membuat metode ekstensi generik seperti ini:

public static TResult GetPropertyValue<TResult>(this object t, string propertyName)
{
    object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null);
    return (TResult)val;
}

Anda juga dapat melakukan beberapa penanganan kesalahan jika Anda mau.

Cameron Forward
sumber
1

Untuk menghindari refleksi, Anda dapat mengatur Kamus dengan nama yang tepat sebagai kunci dan fungsi di bagian nilai kamus yang mengembalikan nilai yang sesuai dari properti yang Anda minta.

Paul McCarthy
sumber