Создайте индексный класс в c # .Net - PullRequest
5 голосов
/ 17 августа 2011

У меня есть несколько классов, и я хочу получить доступ к их свойствам, используя индекс или что-то вроде

ClassObject[0] или лучше будет ClassObject["PropName"]

вместо этого

ClassObj.PropName.

Спасибо

Ответы [ 5 ]

8 голосов
/ 17 августа 2011

Вам нужны индексаторы:

http://msdn.microsoft.com/en-us/library/aa288465(v=vs.71).aspx

public class MyClass
{
    private Dictionary<string, object> _innerDictionary = new Dictionary<string, object>();

    public object this[string key]
    {
        get { return _innerDictionary[key]; }
        set { _innerDictionary[key] = value; }
    }
}

// Usage
MyClass c = new MyClass();
c["Something"] = new object();

Это кодирование в блокноте, поэтому используйте его с щепоткой соли, однако синтаксис индексатора правильный.

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

В качестве альтернативы, посмотрите на dynamic объекты, в частности ExpandoObject, который может быть приведен к IDictionary для доступа к членам на основе буквенных строковых имен.

7 голосов
/ 17 августа 2011

Вы можете сделать что-то вроде этого, псевдокод :

    public class MyClass
    {

        public object this[string PropertyName]
        {
            get
            {
                Type myType = typeof(MyClass);
                System.Reflection.PropertyInfo pi = myType.GetProperty(PropertyName);
                return pi.GetValue(this, null); //not indexed property!
            }
            set
            {
                Type myType = typeof(MyClass);
                System.Reflection.PropertyInfo pi = myType.GetProperty(PropertyName);
                pi.SetValue(this, value, null); //not indexed property!
            }
        }
    }

и после использования, например,

MyClass cl = new MyClass();
cl["MyClassProperty"] = "cool";

Обратите внимание, что это не полное решение,так как вам нужно «поиграть» с BindingFlags во время доступа к отражению, если вы хотите иметь непубличные свойства / поля, статические и так далее.

0 голосов
/ 17 августа 2011

Я не уверен, что вы имеете в виду здесь, но я скажу, что вы должны сделать ClassObject какой-то тип IEnumirable, например List<> или Dictionary<>, чтобы использовать его для нацеливания наздесь.

0 голосов
/ 17 августа 2011

Здесь как использовать индексаторы и примеры того, что вы ищете.

0 голосов
/ 17 августа 2011
public string this[int index] 
 {
    get 
    { ... }
    set
    { ... }
 }

Это даст вам проиндексированное свойство.Вы можете установить любой параметр по вашему желанию.

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