如何存储对基于传递给方法的表达式创建的泛型类型的引用

本文关键字:方法 表达式 创建 引用 泛型类型 于传递 何存储 存储 | 更新日期: 2023-09-27 17:58:42

我有以下方法,它根据定义的表达式的返回类型返回类型为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?
    }
}

提前感谢!

如何存储对基于传递给方法的表达式创建的泛型类型的引用

我会尝试实现一个通用的、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 { ... }

为什么不采用额外的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;
}