Как я могу получить значение свойства строки через Reflection? - PullRequest
20 голосов
/ 12 июня 2009
public class Foo
{
   public string Bar {get; set;}
}

Как получить значение Bar, строковое свойство, через отражение? Следующий код вызовет исключение, если тип 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.

Кроме того, как мне узнать, является ли свойство индексатором?

Ответы [ 9 ]

45 голосов
/ 12 июня 2009

Вы можете просто приобрести недвижимость по названию:

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)*/});
}
5 голосов
/ 12 июня 2009

Я не мог воспроизвести проблему. Вы уверены, что не пытаетесь сделать это для некоторого объекта со свойствами индексатора? В этом случае ошибка, с которой вы столкнетесь, будет сгенерирована при обработке свойства 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");
4 голосов
/ 12 июня 2009
var val = f.GetType().GetProperty("Bar").GetValue(f, null);
4 голосов
/ 12 июня 2009
Foo f = new Foo();
f.Bar = "x";

string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null);
3 голосов
/ 12 июня 2009
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;
    }
}
2 голосов
/ 05 августа 2017

Легко получить значение свойства любого объекта с помощью метода расширения, например:

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");
2 голосов
/ 12 июня 2009
PropertyInfo propInfo = f.GetType().GetProperty("Bar");
object[] obRetVal = new Object[0];
string bar = propInfo.GetValue(f,obRetVal) as string;
0 голосов
/ 16 января 2019

Чтобы получить имена свойств объекта, просто передавая объект, вы можете использовать эту функцию, возможно, это работает.

просто сделайте объектный объект классом и перейдите в него.

 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 :" + pro.Name + " Value : "+  pro.GetValue(obj, null).ToString());
        }

    }

Но это будет работать только тогда, когда свойства объекта "Public"

0 голосов
/ 02 июля 2013

getvalue с object и null отлично работает для меня. Спасибо за сообщения.

Контекст: цикл по всем свойствам в модели MVC для новых сотрудников и определение их значений в форме:

newHire => Модель со многими свойствами, чьи значения опубликованных форм я хочу записать индивидуально в набор записей базы данных

foreach(var propertyValue in newHire.GetProperties())
{
string propName = propertyValue.Name;

string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...