Как сохранить ссылку на общий тип, созданный на основе выражения, переданного методу?

У меня есть следующий метод, который возвращает общий объект типа INamedProperty на основе возвращаемого типа определенного выражения. Мне нужно сохранить ссылку на объект, который возвращается этим методом для дальнейшей обработки. Какой тип я должен хранить? Будет ли Object в порядке? Как я верну его обратно к соответствующему INamedProperty позже? Мне также нужно сохранить тип 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?
 }
}
</treturn></func<t,></treturn></treturn></t></t>

Спасибо заранее!

2 ответа

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

interface INamedProperty
{
 // Informational
 Type ContainingType { get; }
 string Name { get; }
 Type ReturnType { get; }
 // Operations (for example)
 void CopyTo(object obj, INamedProperty property);
}

Затем реализуйте их в общем NamedProperty:

class NamedProperty<t> : INamedProperty { ... }
</t>


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

Изменить: добавленный образец кода

public INamedProperty<treturn> Named<treturn>(Expression<func<t, treturn="">> property, Action<inamedproperty<treturn>> action)
{
 var o = new NamedProperty<treturn>();
 action.Invoke(o);
 return o;
}
</treturn></inamedproperty<treturn></func<t,></treturn></treturn>

licensed under cc by-sa 3.0 with attribution.