如何使用模板化委托

时间:2015-12-17 18:07:02

标签: c# templates generics delegates

我试图在我的一个班级中使用模板化的委托。

这里是类定义:

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客户端个人资料

1 个答案:

答案 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 - 你最好与之相符。