Есть ли способ сохранить указатель на свойство в C #? - PullRequest
1 голос
/ 11 июля 2019

Например, если я хотел сделать что-то вроде этого:

class Program
{
    static void Main(string[] args)
    {
        var dictionary = new Dictionary<string, Property<AddressInfo>>
        {
            { "f", (thing) => thing.Foo },
            { "o", (thing) => thing.Foo },
            { "o", (thing) => thing.Foo },
            { "b", (thing) => thing.Bar },
            { "a", (thing) => thing.Bar },
            { "r", (thing) => thing.Bar },
        };
    }
}

class Thing
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

В противном случае я должен хранить и получатель, и установщик как Func и Action отдельно.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Я не нашел никакого собственного способа сделать это, но вы можете создать структуру, которая бы это делала.Отказ от ответственности: я реализовал это, потому что это было весело.Я не тестировал, так что это всего лишь идея, и я сомневаюсь, что она эффективна.

public class PropertyHolder<T, Y>
{
    private static object[] emptyArray = new object[0];

    public PropertyHolder(Y instance, string propertyName)
    {
        var property = typeof(Y).GetProperty(propertyName);
        var setMethod = property.SetMethod;
        var getMethod = property.GetMethod;
        Set = (t) => setMethod.Invoke(instance, new object[]{t});
        Get = () => (T) getMethod.Invoke(instance, emptyArray);
    }

    public Action<T> Set { get; private set; }        
    public Func<T> Get { get; private set; }        
}

Вы можете использовать это следующим образом:

public class Toto
{
    public int TheInt { get; set; }
}

var x = new Toto();
var propPointer = new PropertyHolder<int,Toto>(x, nameof(Toto.TheInt));
0 голосов
/ 11 июля 2019

Есть ли способ сохранить указатель на свойство в C #?

Нет, в основном.

Вы можете подойти довольно близко, если оно ref- вернуть свойство, но вы также не можете сохранить ref - вы можете использовать его только в стеке.

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