我试图在我的一个班级中使用模板化的委托。
这里是类定义:
internal class MyClass : BaseClass
{
public delegate T Create<T>(int identity) where T : SomeOtherClass;
public Create<T> CreateCB {get;set;} //<-- This here doesn't compile
}
我会使用CreateCB
这样的
return CreateCB<InheritedClassFromSomeOtherClass>(someId);
和
return CreateCB<OtherInheritedClassFromSomeOtherClass>(someId);
等
我无法对整个MyClass
进行模板制作,因为它需要使用委托来创建从SomeOtherClass
继承的许多不同类型
不编译的行不需要是属性,但我仍然需要使用我的通用模板化委托。我怎么能这样做?
我的应用目标.net 4客户端个人资料
答案 0 :(得分:1)
您的T
的范围限定为委托,但您尝试在该属性中使用的T
未定义。
您的问题是没有通用属性,因此您无法定义T
。
有两种解决方法:
使该类具有通用性,因此无处不在T
定义:
internal class MyClass<T> : BaseClass
where T : SomeOtherClass
{
public delegate T Create(int identity);
// Now T is in scope
public Create CreateCB { get; set; }
}
使用getter / setter对,如果你真的不能使该类通用,但这是...... 丑陋:
internal class MyClass : BaseClass
{
private object _createCB;
public delegate T Create<T>(int identity)
where T : SomeOtherClass;
public Create<T> GetCreateCB<T>()
where T : SomeOtherClass;
{
return (Create<T>)_createCB;
}
public void SetCreateCB<T>(Create<T> fn)
where T : SomeOtherClass;
{
_createCB = fn;
}
}
希望这段代码能够说明为什么首先没有通用属性这样的东西。由于存储,你无论如何都会失去强大的打字。而且你必须明确地在每个获取/设置上提供T
- 你最好与之相符。