Доступ к свойствам объекта из строковых представлений - PullRequest
1 голос
/ 19 марта 2010

В ActionScript к свойству объекта можно получить доступ следующим образом:

object["propertyname"]

Возможно ли что-то подобное в c #, без использования отражения?

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

Нет, вы должны использовать отражение.
Если бы можно было создать вспомогательный метод расширения, как в этом примере:

using System;

static class Utils {
    public static T GetProperty<T>(this object obj, string name) {
        var property = obj.GetType().GetProperty(name);
        if (null == property || !property.CanRead) {
            throw new ArgumentException("Invalid property name");
        }
        return (T)property.GetGetMethod().Invoke(obj, new object[] { });
    }
}

class X {
    public string A { get; set; }
    public int B { get; set; }
}

class Program {
    static void Main(string[] args) {
        X x = new X() { A = "test", B = 3 };
        string a = x.GetProperty<string>("A");
        int b = x.GetProperty<int>("B");
    }
}

Это не хорошо, однако.
Во-первых, потому что вы превращаете ошибки времени компиляции в ошибки времени выполнения.
Во-вторых, снижение производительности от отражения в этом случае неоправданно. Я думаю, что лучший совет здесь заключается в том, что вы не должны пытаться программировать на C #, как если бы это был ActionScript.

0 голосов
/ 19 марта 2010

Вы можете определить индексатор в вашем классе:

public class IndexerTest
{
    private Dicionary<string, string> keyValues = new ...

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

И используйте это так:

string property = indexerTest["propertyName"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...