Как я могу получить значение свойства string через Reflection?
public class Foo
{
public string Bar {get; set;}
}
Как получить значение Bar, свойство string, через отражение? Следующий код генерирует исключение, если тип PropertyInfo - это System.String
Foo f = new Foo();
f.Bar = "Jon Skeet is god.";
foreach(var property in f.GetType().GetProperties())
{
object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type
}
Похоже, что моя проблема в том, что свойство является типом индексатора с System.String.
Также, как определить, является ли свойство индексом?
Ответы
Ответ 1
Вы можете просто получить свойство по имени:
Foo f = new Foo();
f.Bar = "Jon Skeet is god.";
var barProperty = f.GetType().GetProperty("Bar");
string s = barProperty.GetValue(f,null) as string;
Относительно следующего вопроса:
Индексаторы всегда будут называться Item и иметь аргументы на геттере.
Так
Foo f = new Foo();
f.Bar = "Jon Skeet is god.";
var barProperty = f.GetType().GetProperty("Item");
if (barProperty.GetGetMethod().GetParameters().Length>0)
{
object value = barProperty.GetValue(f,new []{1/* indexer value(s)*/});
}
Ответ 2
Я не мог воспроизвести проблему. Вы уверены, что не пытаетесь сделать это на каком-либо объекте с помощью свойств индексатора? В этом случае ошибка, которую вы испытываете, будет выбрана при обработке свойства Item.
Кроме того, вы можете сделать это:
public static T GetPropertyValue<T>(object o, string propertyName)
{
return (T)o.GetType().GetProperty(propertyName).GetValue(o, null);
}
...somewhere else in your code...
GetPropertyValue<string>(f, "Bar");
Ответ 3
Foo f = new Foo();
f.Bar = "x";
string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null);
Ответ 4
var val = f.GetType().GetProperty("Bar").GetValue(f, null);
Ответ 5
Foo f = new Foo();
f.Bar = "Jon Skeet is god.";
foreach(var property in f.GetType().GetProperties())
{
if(property.Name != "Bar")
{
continue;
}
object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type
}
И вот для последующих действий:
class Test
{
public class Foo
{
Dictionary<string, int> data =new Dictionary<string,int>();
public int this[string index]
{
get { return data[index]; }
set { data[index] = value; }
}
public Foo()
{
data["a"] = 1;
data["b"] = 2;
}
}
public Test()
{
var foo = new Foo();
var property = foo.GetType().GetProperty("Item");
var value = (int)property.GetValue(foo, new object[] { "a" });
int i = 0;
}
}
Ответ 6
PropertyInfo propInfo = f.GetType().GetProperty("Bar");
object[] obRetVal = new Object[0];
string bar = propInfo.GetValue(f,obRetVal) as string;
Ответ 7
Легко получить значение свойства любого объекта с помощью метода расширения:
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);
}
}
Использование:
Foo f = new Foo();
f.Bar = "x";
var balbal = f.GetPropertyValue("Bar");
Ответ 8
getvalue с объектом и значением null отлично справился со мной. Спасибо за сообщения.
Контекст: объединение всех свойств в модели MVC для New Hires и определение их значений, размещенных в форме:
newHire = > Модель со многими свойствами, значения опубликованных форм которой я хочу написать индивидуально для набора записей базы данных
foreach(var propertyValue in newHire.GetProperties())
{
string propName = propertyValue.Name;
string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString();
}
Ответ 9
Чтобы получить имена свойств объекта, просто передавая объект, вы можете использовать эту функцию, возможно, это работает.
просто сделайте объектный объект классом и перейдите в него.
public void getObjectNamesAndValue(object obj)
{
Type type = obj.GetType();
BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
PropertyInfo[] prop = type.GetProperties(flags);
foreach (var pro in prop)
{
System.Windows.Forms.MessageBox.Show("Name : {0} , Value {1}",pro.Name,pro.GetValue(obj,null).toString());
}
}
Но это будет работать только тогда, когда свойства объекта "Public"