Мне нужно получить значение свойства конкретного объекта, но не знаю тип объекта - PullRequest
3 голосов
/ 15 августа 2011

У меня есть объект c #, и я не знаю тип этого объекта. (т.е. объект o) Что я знаю, так это то, что у этого объекта есть член с именем 'ID' типа int.

Я хотел получить значение этого свойства, но я недостаточно хорош с отражением ...

Я могу получить тип и члены этого объекта:

Type type = obj.GetType();
System.Reflection.MemberInfo[] member = type.GetMember("ID");

... но не знаю, что делать дальше: -)

Спасибо за помощь заранее Мариуш

Ответы [ 4 ]

4 голосов
/ 15 августа 2011

Это публичная собственность? Тогда самый простой способ - использовать dynamic

int value = ((dynamic)obj).ID;
4 голосов
/ 15 августа 2011

Вы можете использовать:

Type type = obj.GetType();
PropertyInfo property = type.GetProperty("ID");
int id = (int) property.GetValue(obj, null);
  • Используйте PropertyInfo, потому что вы знаете, что это свойство, которое делает вещи проще
  • Вызовите GetValue, чтобы получить значение, передав obj в качестве цели свойства и null для аргументов индексатора (поскольку это свойство, а не индекс)
  • Приведите результат к int, как вы уже знаете, это будет int

Предложение Джареда использовать dynamic тоже хорошо, если вы используете C # 4 и .NET 4, хотя, чтобы избежать всех скобок, я, вероятно, напишу это как:

dynamic d = obj;
int id = d.ID;

(если вам это не нужно в одном выражении по какой-то причине).

2 голосов
/ 15 августа 2011

Можете ли вы использовать C # 4? В этом случае вы можете использовать dynamic:

dynamic dyn = obj;
int id = dyn.ID;
1 голос
/ 15 августа 2011
public class TestClass
{
    public TestClass()
    {
        // defaults
        this.IdField = 1;
        this.IdProperty = 2;
    }

    public int IdField;
    public int IdProperty { get; set; }
}

// here is an object obj and you don't know which its underlying type
object obj = new TestClass();
var idProperty = obj.GetType().GetProperty("IdProperty");
if (idProperty != null)
{
    // retrieve it and then parse to int using int.TryParse()
    var intValue = idProperty.GetValue(obj, null);
}

var idField = obj.GetType().GetField("IdField");
if (idField != null)
{
    // retrieve it and then parse to int using int.TryParse()
    var intValue = idField.GetValue(obj);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...