【问题标题】:C#: Restricting Types in method parameters (not generic parameters)C#:限制方法参数中的类型(不是泛型参数)
【发布时间】:2010-10-27 12:35:42
【问题描述】:

我想编写如下函数

public void Foo(System.Type t where t : MyClass)
{ ... }

换句话说,参数类型是System.Type,我想将允许的Types 限制为从MyClass 派生的那些。

有没有办法在语法上指定这个,或者t必须在运行时检查?

【问题讨论】:

  • 也许你的方法是错误的。在我看来,在 MyClass 上创建实例方法 Foo() 会容易得多,这样所有派生类都可以调用 Foo 并且您可以使用 this.GetType() 执行相同的行为而无需额外的健全性检查.
  • 我这样做是为了反射功能——在函数中,我需要访问类型的属性。

标签: c# .net types polymorphism


【解决方案1】:

如果您的方法必须采用 Type 类型作为参数,则无法执行此操作。如果你对方法调用有灵活性,你可以这样做:

public void Foo(MyClass myClass)

并通过调用.GetType() 获取Type。

扩大一点。 System.Type 是参数的类型,因此无法进一步指定应传递的内容。就像采用 1 到 10 之间的整数的方法一样,必须采用 int 并在运行时检查是否正确遵守了限制。

【讨论】:

    【解决方案2】:

    你为什么不使用

    public void foo<t>();
    

    改为?

    【讨论】:

      【解决方案3】:

      你想要的理论上可以用属性来完成。但这更清楚(imo)并且做的事情完全相同:

      public void Foo(MyClass m) {
         Type t = m.GetType();
         // ...
      }
      

      【讨论】:

      • 如何使用属性来做到这一点?你能扩展一下吗?
      【解决方案4】:

      您可以使用以下内容:

      public void Foo<T>(T variable) where T : MyClass
      { ... }
      

      调用如下:

      {
          ...
          Foo(someInstanceOfMyClass);
          ...
      }
      

      【讨论】:

      • 这不是 OP 要求的。
      【解决方案5】:

      将类型指定为 MyClass 或派生自它,是对参数本身的值检查。就像在

      中说hello参数
      void Foo(int hello) {...}
      

      必须在 10 到 100 之间。无法在编译时检查。

      您必须使用泛型或在运行时检查类型,就像任何其他参数值检查一样。

      【讨论】:

        【解决方案6】:

        您还可以使用扩展方法,该方法可用于所有可转换为 MyClass 的对象:

        public static class MyClassExtensions
        {
            public static void Foo(this MyClass obj)
            {
               // ...
            }
        }
        

        你可以把它当作对象的普通方法来使用:

        var x = new MyClass();
        x.Foo();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-27
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-26
          相关资源
          最近更新 更多