【发布时间】:2011-02-22 15:06:40
【问题描述】:
我正在查看this question 关于一个容器中的多个泛型类型的答案,但我无法真正让它工作:Metadata 类的属性不可见,因为抽象类不拥有他们。这是原始问题中代码的略微修改版本:
public abstract class Metadata
{
}
public class Metadata<T> : Metadata
{
// Per Ben Voigt's comments, here are the rest of the properties:
public NUM_PARAMS NumParams { get; set; }
public FUNCTION_NAME Name { get; set; }
public List<Type> ParamTypes { get; set; }
public Type ReturnType { get; set; }
//...C
public T Function { get; set; }
public Metadata(T function)
{
Function = function;
}
}
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<Func<double,double>>(SomeFunction));
metadataObjects.Add(new Metadata<Func<int,double>>(SomeOtherFunction));
metadataObjects.Add(new Metadata<Func<double,int>>(AnotherFunction));
foreach( Metadata md in metadataObjects)
{
var tmp = md.Function; // <-- Error: does not contain a definition for Function
}
确切的错误是:
错误 CS1061:“元数据”不 包含“功能”的定义并且没有 扩展方法 'Function' 接受 “元数据”类型的第一个参数 可以找到(您是否缺少 使用指令或程序集 参考?)
我相信这是因为抽象类没有定义属性Function,因此整个努力完全没有用。有没有办法获取属性?
更新
基本思想是我有一个遗传程序,它使用函数的Metadata(或MetaFunctions)来构建具有这些函数的表达式树。元数据允许我将一个函数的返回值与另一个函数的输入参数正确匹配……它基本上将我的函数变成了乐高积木,计算机可以以各种方式组合它们。这些函数都在同一个“域”内,所以我随机混合和匹配它们不会有任何问题。
我将Metadata 或MetaFunctions 存储到几个字典中:
- 以函数名作为键。
- 另一个以参数个数为key。
在任何情况下,我只是尽量贴近原始问题...无论我使用List 还是Dictionary,基本问题都是相同的。我也被 .NET 3.5 卡住了,暂时无法更新到 .NET 4.0。
【问题讨论】:
-
你提前知道你所有可能的函数类型吗?
-
@luke,是的,我愿意...我定义了它们中的每一个。
-
Bryan 在链接问题中的解决方案应该适用于您的情况。
标签: c# generics delegates containers abstract-class