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;
}

Jawaban:


311
return car.GetType().GetProperty(propertyName).GetValue(car, null);

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");

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);

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"));
    }

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");

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.