Bu bir yerde ele alınmışsa özür dilerim. İlan etmeden önce araştırma yaptım!Yansıma yoluyla tek bir çağrıyla hem alanları hem de özellikleri nasıl alabilirim?
tamam, bu yüzden soru ... GetType() .GetProperties kullanıyorum, ancak bunlara alma/ayarlama yapmayan basit örnek alanları döndürmüyor ... bu yüzden .GetFields kullanıyorum. onları bulur, ancak alanlar ve özellikler arasında geçiş yapmadan bir değer elde etmek/ayarlamak için basit bir tek nesne almak istiyorum ... bu mümkün mü?
Güncel kodum harika çalışıyor, PropertyInfo üzerinde çalışıyor, ancak sanırım alanlar için değil?
[değiştir] Bu, iyi çalıştığım bir çözümdür. Fark etmiş görünmektedir olarak herkese teşekkürler .... GetProperties() ve GetFields() ait
// some logic borrowed from James Newton-King, http://www.newtonsoft.com
public static void SetValue(this MemberInfo member, object property, object value)
{
if (member.MemberType == MemberTypes.Property)
((PropertyInfo)member).SetValue(property, value, null);
else if (member.MemberType == MemberTypes.Field)
((FieldInfo)member).SetValue(property, value);
else
throw new Exception("Property must be of type FieldInfo or PropertyInfo");
}
public static object GetValue(this MemberInfo member, object property)
{
if (member.MemberType == MemberTypes.Property)
return ((PropertyInfo)member).GetValue(property, null);
else if (member.MemberType == MemberTypes.Field)
return ((FieldInfo)member).GetValue(property);
else
throw new Exception("Property must be of type FieldInfo or PropertyInfo");
}
public static Type GetType(this MemberInfo member)
{
switch (member.MemberType)
{
case MemberTypes.Field:
return ((FieldInfo)member).FieldType;
case MemberTypes.Property:
return ((PropertyInfo)member).PropertyType;
case MemberTypes.Event:
return ((EventInfo)member).EventHandlerType;
default:
throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", "member");
}
}
OP'den: "bir değer almak/ayarlamak için basit bir tek nesne edinin". MemberInfo'nun bunu nasıl yaptığından emin değilim. – CrazyCasta
@CrazyCasta gerçekten; İsterseniz, çekirdek yansıma API'sinin dışına çıkmanız gerekir * bunun için * paylaşılan bir arayüz yoktur. Ancak, ayrı kütüphaneler var, bu yüzden FastMember'i alıntıladım. –
İkisi de yararlı olduğu için hem @CrazyCasta hem de marc'ı işaretlemek isterim, ama sonuç olarak MemberInfo ile uzantı yöntemlerini kullanarak yaptım. – Timmerz