【问题标题】:Passing Type as argument but constraining to interface将类型作为参数传递但限制为接口
【发布时间】:2013-07-17 19:07:10
【问题描述】:

我在构造函数中将对象的Type 作为参数传递,但我想将类型限制为仅从特定接口继承的对象。

public MyClass(Type myType);

我知道我可以检查该类型是否继承自方法主体中的接口,如下所示:

if(typeof(IMyInterface).IsAssignableFrom(myType))

但是参数的类型约束可能吗?

【问题讨论】:

  • C# 世界中没有任何东西可以让您进一步限制参数,而不仅仅是通过它的类型和继承。当您编写一个采用 int 的方法时,也无法将方法限制为仅接受 [0, 10] 范围内的数字(通过良好的语法)。你想要的是使用 PostSharp、CodeContracts 或类似的东西,当某些条件不满足时会抛出异常,例如当给定的 Type 对象没有实现某个接口时。您始终可以自己编写此代码,在这种情况下只需抛出 ArgumentException。

标签: c# types type-constraints


【解决方案1】:

你为什么不让你的类通用?在这种情况下,您可以指定您的约束,而不必费心检查参数。

例如

public class MyClass<T>
    where T : IMyInterface
{
    ....
}

【讨论】:

    【解决方案2】:

    因为您显示了在运行时检查类型的代码,所以我假设您希望在编译时强制执行类型约束:

    public class MyClass<T> where T : IMyInterface {
        public MyClass(T myArg) {
            Type myType = typeof(T);
            Type argType = myArg.GetType();
            Debug.Assert(myType == argType, "types must be the same!");
        }
    }
    

    你不能在构造函数中这样做,但你可以在类声明中这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2011-12-04
      • 2013-04-09
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2020-10-27
      相关资源
      最近更新 更多