Подтвердить что ты не робот

Как я могу получить значение свойства 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.

Также, как определить, является ли свойство индексом?

4b9b3361

Ответ 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"