Доступ к недвижимости по индексу - PullRequest
3 голосов
/ 19 октября 2011

Мне нужно получить доступ к свойству по индексу или что-то подобное.Причина, по которой это объясняется в , это уже отвеченный вопрос .Этот ответ использует Linq, и я предпочитаю что-то без этой зависимости.У меня нет контроля над классом.

public class myClass
{
    private string s = "some string";
    public string S
    {
        get { return s; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        myClass c = new myClass();
        // I would like something similar
        // or same functionality
        string s = c["S"];
    }
}

Ответы [ 3 ]

6 голосов
/ 19 октября 2011

Поскольку у вас нет контроля над классом, вы можете использовать метод расширения и отражения, чтобы получить значение свойства по имени:

static class ObjectExtensions
{
    public static TResult Get<TResult>(this object @this, string propertyName)
    {
        return (TResult)@this.GetType().GetProperty(propertyName).GetValue(@this, null);
    }
}

Использование:

class A
{
    public string Z
    {
        get;
        set;
    }

    public int X
    {
        get;
        set;
    }
}

class Program
{
    static void Main(string[] args)
    {
        A obj = new A();
        obj.Z = "aaa";
        obj.X = 15;

        Console.WriteLine(obj.Get<string>("Z"));
        Console.WriteLine(obj.Get<int>("X"));
        Console.ReadLine();

    }
}
3 голосов
/ 19 октября 2011

use (EDIT - согласно комментарию):

string s = c.GetType().GetProperty ("S").GetGetMethod().Invoke (c, null).ToString();

Это дает вам значение (public) свойства с именем S экземпляра c независимо от типа c и вообще не использует LINQ, хотя должен признать, что не понимаю, почему LINQ должен быть проблемой ...

0 голосов
/ 19 октября 2011

Вы можете добиться того же, используя свойство по умолчанию для вашего класса и коллекции. При условии, что вам всегда будут нужны строки, вы можете использовать класс Dictionary в качестве свойства по умолчанию.

Тогда в конструкторе вы можете инициализировать myDictionary["s"] = "some string";

Затем вы можете использовать myClass как коллекцию, поэтому myClass ["s"] вернет "некоторую строку".

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

См. Эту статью MSDN :

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