如何指定不实现特定接口的类型参数?
-
27-09-2019 - |
题
我已经为对象开发了一些扩展方法,我不想在实现 IEnumerable 的对象的智能感知中使用/显示这些方法。从概念上讲,我想要如下所示的东西
public static T SomeMethod<T>(this object value) where T != IEnumerable
{
}
是否有可能在 C# 中施加这种约束?
编辑
抱歉,我以错误的方式提出了问题。我知道 C# 中允许的约束,我想知道是否有其他方法可以实现这一点?
解决方案
只是为了确认 Øyvind 的评论:C# 中没有这样的约束。唯一的约束类型是:
where T : struct
(不可空值类型约束)where T : class
(引用类型约束)where T : SomeClassName
(转换为特定类约束)where T : ISomeInterfaceName
(转换为特定的接口约束)where T : U
(转换为另一种类型参数约束)where T : new()
(无参数构造函数约束)
请注意,我只分离出了特定的类和接口约束,因为前者是主要约束,后者是次要约束。
其他提示
这是不受支持的。法律约束列出 rel="nofollow">这里。
这是不可能的。
正如其他人提到你想要做的是行不通的,但是,你可以看看你想支持,并限制一些类/接口,它们的共同点,是什么类型的对象,或者你可能只是需要沟通用部分和写几篇扩展方法,这样你就可以禁止的IEnumerable
您不能,我同意这是一个麻烦事,但我已经找到了自己想要与其说是你在找什么,作为压倒一切的约束(的基础上,这样我可以具有例如类和相同的方法或类,以及一个结构版本具有用作适用适当的一个)。
有两种情况下,我们可以顺利拿到。
一个是我们的原因不希望使用的扩展方法是,它已经作为一个实例方法提供。事实上,我们得到这个免费的;实例方法总是用来代替扩展方法(尽管当调用derivedClass.method()
如果它仅在baseClass.method()
存在derivedClass
不会”被使用)。
在另一种情况是运行时的选择:
public static T SomeMethod<T>(this object value) where T != IEnumerable
{
if(typeof(T).GetInterface("IEnumerable") != null)
{
//behaviour appropriate for IEnumerable
}
else
{
//other behaviour.
}
}
这不是理想的,尤其是如果只有“行为适合的IEnumerable”的是抛出一个异常,但它有时是不够的。
您可以做这样的事情,但仅的类型为你控制。
说你想拥有一个像这样的方法:
public static class XmlSerializableExtension {
public static string ToXml(this object self) {
// ...
}
}
但你不想污染与它的每一个对象,只有你的类的子集。
可以实现这样的:
public interface MXmlSerializable { }
public static class XmlSerializable {
public static string ToXml(this MXmlSerializable self) {
// ...
}
}
现在,您标记的类要此方法适用于具有的 “混入” 接口:
public class MyClass : MXmlSerializable {
// ...
}
和它只会出现在智能感知这些类。