繁体   English   中英

如何使用模板委托

[英]How to use templated delegate

我正在尝试在我的一个课程中使用模板化委托。

这里的类定义:

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这样的CreateCB

return CreateCB<InheritedClassFromSomeOtherClass>(someId);

return CreateCB<OtherInheritedClassFromSomeOtherClass>(someId);

等等

我无法对整个MyClass模板化,因为它将需要使用委托来创建许多继承自SomeOtherClass类型

不编译的行不必是属性,但是我仍然需要使用我的通用模板委托。 我怎样才能做到这一点?

我的应用程序目标.net 4客户端配置文件

您的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; } } 

    希望这段代码能说明为什么一开始就没有通用属性。 无论如何,您会因为存储而失去强类型。 而且您必须在每个get / set上显式提供T最好与之保持一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM