2017-02-01 4 views
1

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

public class MyObject 
{ 
    public int thing_1 { get; set; } 
    public int thing_2 { get; set; } 
    public int thing_3 { get; set; } 
    .... 
    public int thing_100 { get; set; } 
} 

Как бы я сделать что-то вроде этого:

int valueINeed = GetValue(MyObject, 2); 

Какой бы назвать ... (и это где мне нужна помощь) ...

private int GetValue(MyObject, int find) 
{ 
    return MyObject.thing_[find]; 
} 

Я бы предпочел не идти построчно в коммутаторе, если это можно избежать.

+0

хороший момент. Я очищу его –

ответ

2

Это может помочь:

MyChildObject obj = new MyChildObject(); 
foreach(var prop in obj .GetType().GetProperties()) 
{ 
    if (prop.Name == "thing_" + find.ToString()) 
     return prop.GetValue(obj, null); 
} 
+0

работал как шарм! –

0

В зависимости от ситуации в реальном мире вы можете сделать что-то более сложное, чем прямолинейное отражение (которое может быть медленным).

Динамический Language Runtime (поддержка dynamic) может быть полезным, и есть некоторые дискуссии по этому вопросу: How to call DynamicObject.TryGetMember directly?

Существует также answer там, который ссылается на пакет Dynamitey NuGet. Используя это, ваша GetValue() рутина теперь просто:

public class MyObject 
{ 
    public int thing_1 { get; set; } 
    ... 
    int GetValue(int find) 
    { 
     return (int)Dynamic.InvokeGet(this, "thing_" + find.ToString()); 
    } 
} 
Смежные вопросы