Как сохранить ссылку на универсальный тип, созданный на основе выражения, переданного методу? - PullRequest
3 голосов
/ 08 июня 2011

У меня есть следующий метод, который возвращает универсальный объект типа INamedProperty<TReturn> на основе типа возврата определенного выражения.Мне нужно сохранить ссылку на объект, который возвращается этим методом для дальнейшей обработки.Какого типа я должен хранить это как?Object будет в порядке?Как бы я вернул его к соответствующему INamedProperty<TReturn> позже?Мне также нужно хранить тип TReturn?

public class PropertyBuilder<T> : IPropertyBuilder<T> where T : class {
    public INamedProperty<TReturn> Named<TReturn>(Expression<Func<T, TReturn>> property) {
        o = new NamedProperty<TReturn>();
        // how do I store o as an instance of the encapsulating class?
    }
}

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Я бы попытался реализовать универсальный, не -генерический INamedProperty, который мог бы реализовать необходимые операции:

interface INamedProperty
{
    // Informational
    Type ContainingType { get; }
    string Name { get; }
    Type ReturnType { get; }

    // Operations (for example)
    void CopyTo(object obj, INamedProperty property);
}

Затем реализоватьих в общем именованном свойстве:

class NamedProperty<T> : INamedProperty { ... }
0 голосов
/ 08 июня 2011

Почему бы не взять дополнительный параметр Action вместо сохранения ссылки?Вы сталкиваетесь с проблемами, потому что TReturn на самом деле не существует в конкретной форме вне контекста выполнения вашего метода;Подумайте, более функциональное программирование и меньше процедурного.

edit: добавлен пример кода

public INamedProperty<TReturn> Named<TReturn>(Expression<Func<T, TReturn>> property, Action<INamedProperty<TReturn>> action)
{
    var o = new NamedProperty<TReturn>();
    action.Invoke(o);
    return o;
}
...