这篇文章是在延续这一个.
我试图了解我是否是唯一一个错过并需要.NET泛型类型的人才能继承其通用参数类型的人.
挑战是收集有利于此功能的令人信服的理由,或者,知道没有.
我有理由把它作为这个问题的答案 - 见下文.
我要求那里的人添加他们作为这篇文章的答案.
如果你不同意这个功能是有用的或者没有充分的理由支持 - 请不要在这里发布任何内容,尽管你可以在已经启动它的原始帖子中这样做 - 在这里.
PS
一些C++模式在.NET中无关紧要.例如,在他的优秀书籍Modern C++ Design中, Andrei Alexandrescu描述了如何创建在编译时评估的类型列表.当然,这种模式与.NET无关,如果我需要一个类型列表,我只需创建List<Type>
并用类型填充它.因此,让我们尝试提出与.NET框架相关的原因,而不是盲目地将C++编码技术转换为C#.
PPS
当然,这个讨论严格来说是学术性的.即使有问题的一百个令人信服的理由浮出水面,它也不会被实施.
我偶尔偶然发现一个实施问题,我深感遗憾的是C<T>
无法继承T
.不幸的是,我从来没有记录过这些问题,因此我可以描述最近的问题 - 我现在偶然发现的问题.所以这里是:
我们的系统可通过元数据进行扩展,这些元数据在运行时可用.元数据将转换为使用Reflection.Emit在运行时动态生成的类型.不幸的是,动态生成的类型必须满足以下条件:
IDynamicObject
(我们的接口),System.ComponentModel.INotifyPropertyChanged
和Csla.Core.IMobileObject
.请注意,此条件会对祖先类型设置某些约束.例如,祖先类型可能不实现IDynamicObject
接口,除非所有接口方法都是抽象实现的.还有其他约束,必须检查所有约束.object
方法Equals
,ToString
并且GetHashCode
.目前,我不得不使用Reflection.Emit发出所有IL代码来满足这些条件.当然,某些任务可能会转发到静态编译的代码.例如,object.Equals(object)
方法的重写调用DynamicObjectHelper(IDynamicObject, IDynamicObject)
哪个是静态编译的C#代码,它执行比较两个动态对象以获得相等性的最大部分工作.但这更像是一个例外而不是规则 - 大多数实现都被发出,这是一个痛苦的屁股.
能够编写泛型类型不是很好吗,比如DynamicObjectBase<T>
将使用祖先类型实例化并作为动态生成类型的实际基类型?在我看来,泛型类型DynamicObjectBase<T>
可以在静态编译的C#代码中实现许多动态类型需求.动态发出的类型将继承它,并且可能只是覆盖一些简单的虚拟方法.
总而言之,我令人信服的理由是,让C<T>
继承T
可以大大简化发布动态类型的任务.
虽然我明白您的意思,但它看起来像是 .NET 中通过组合对类型构造的支持较差的更普遍问题的特例。https://connect.microsoft.com/VisualStudio/feedback/details/526307/add-automatic- Generation-of-interface-implementation-via-implementing-member 中描述的方法对您来说足够了吗?