2013-05-21 2 views
3

У меня есть список объектов, в котором есть разные объекты. Мне нужно иметь возможность редактировать/читать свойство объектов, все из которых есть, но я не знаю, как это сделать.Свойство/переменная доступа от неизвестного объекта

List<object> objects = new list<object>(); 
SomeObject obj; 

objects.add(obj); 

Int value = objects(0).somevariable; 

Но он, очевидно, не может читать «somevariable», поскольку код не знает, что объект имеет его. Это делает это возможным, поскольку все объекты в списке имеют переменную «somevariable»?

Кроме того, я использую XNA, но это, вероятно, не имеет никакого значения.

Редактировать: Спасибо всем за ваши ответы, я попробую их завтра, когда я получу свой компьютер.

+0

Надеюсь, это невозможно, иначе было бы слишком легко для кого-то выяснить все виды данных, проходящих через сеть. – jp2code

+0

Это очень распространенная проблема, решение состоит в том, чтобы наследовать все объекты из одного класса, который содержит необходимое свойство. – Casperah

+0

http://stackoverflow.com/questions/919699 –

ответ

1

Вы должны использовать отражение.

public static object GetPropertyValue(object obj, string propertyName) 
{ 
    return obj.GetType().GetProperty(propertyName).GetValue(obj, null); 
} 

(но, конечно, использование интерфейса, если это возможно :))

2

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

4

Если вы можете изменить эти классы и имеют смысл в вашем случае, вы могли бы определить общий интерфейс

public interface IMyInterface 
{ 
    int Somevariable { get; set;} 
} 

и пусть ваши классы реализуют этот интерфейс, то вы сможете создать общий список, как это

var objects = new List<IMyInterface>(); 
int value = objects[0].Somevariable; 
0

сделать базовый класс, который содержит "somevariable", и BASECLASSES список, так что список [0] .somevariable можно сделать.

class MyBaseClass 
{ 
    public int SomeVariable{get;set;} 
} 
class MyDerivedClass : MyBaseClass 
{ 
............. 
} 

List<MyBaseClass> l=new List<MyBaseClass>(); 
l[0].SomeVariable=111; 
Смежные вопросы