Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:限制方法参数中的类型(非泛型参数)_C#_.net_Types_Polymorphism - Fatal编程技术网

C#:限制方法参数中的类型(非泛型参数)

C#:限制方法参数中的类型(非泛型参数),c#,.net,types,polymorphism,C#,.net,Types,Polymorphism,我想编写如下函数 public void Foo(System.Type t where t : MyClass) { ... } 换句话说,参数类型是System.type,我想将允许的type限制为从MyClass派生的参数 是否有任何方法可以在语法上指定此参数,或者是否必须在运行时检查t?如果您的方法必须将类型作为参数,则无法执行此操作。如果方法调用具有灵活性,则可以执行以下操作: public void Foo(MyClass myClass) 然后通过调用.GetType()来获取

我想编写如下函数

public void Foo(System.Type t where t : MyClass)
{ ... }
换句话说,参数类型是
System.type
,我想将允许的
type
限制为从
MyClass
派生的参数


是否有任何方法可以在语法上指定此参数,或者是否必须在运行时检查
t

如果您的方法必须将
类型作为参数,则无法执行此操作。如果方法调用具有灵活性,则可以执行以下操作:

public void Foo(MyClass myClass)
然后通过调用
.GetType()
来获取
类型

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

为什么不使用

public void foo<t>();
public void foo();

相反?

从理论上讲,您想要的可以通过属性来实现。但这一点更加明确(imo),并且做了完全相同的事情:

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

您可以使用以下选项:

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

将类型指定为MyClass或从MyClass派生的类型是对参数本身的值检查。这就像在中说hello参数

void Foo(int hello) {...}
必须介于10和100之间。不可能在编译时进行检查


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

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

public static class MyClassExtensions
{
    public static void Foo(this MyClass obj)
    {
       // ...
    }
}
您可以将其当作对象的普通方法来使用:

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

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