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所要求的。如何使用属性实现这一点?你能详细说明一下吗?