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# 如何将System.Type列表传入方法?_C#_.net - Fatal编程技术网

C# 如何将System.Type列表传入方法?

C# 如何将System.Type列表传入方法?,c#,.net,C#,.net,我试图传入系统的列表。在方法中键入。不是实例,而是类型 现在有一个陷阱:我希望通过一个接口限制类型 例如,假设我有这个 public interface IFoo public class Cat : IFoo public class Dog : IFoo 那么这个 public void MyMethod(IEnumerable foos) 但是只允许猫和狗,而不允许其他任何东西 通常,我会这样做:public void MyMethod(IEnumberable foos)但这需要一些f

我试图传入
系统的列表。在方法中键入
。不是实例,而是类型

现在有一个陷阱:我希望通过一个接口限制
类型

例如,假设我有这个

public interface IFoo
public class Cat : IFoo
public class Dog : IFoo
那么这个

public void MyMethod(IEnumerable foos)
但是只允许猫和狗,而不允许其他任何东西


通常,我会这样做:
public void MyMethod(IEnumberable foos)
但这需要一些foo实例,这不是我想要做的。

我假设您的方法只需要实现
IFoo
的实例(对象)列表。如果是,则使用
IEnumerable
;例如:

public void MyMethod(IEnumerable<IFoo> foos) { ... }
publicsvoidmymethod(T类型),其中T:List,List
公共静态void MyMethod(键入类型),其中T:ICat{}
ICat ICat=新类别2();
//这将不起作用,因为它的类型错误
IDog IDog=新类2();
MyMethod(icat.GetType());

没有。你回答这个问题时,我刚刚编辑了我的问题:)我建议
if(foos.Any(t=>!t.IsAssignableFrom(typeof(IFoo)){/*blow up*/}
@rossipedia也可以,但是你需要删除第一个
答案并不局限于猫和狗,除非你不能。但是在运行时,您可以检查是否得到了正确的东西,例如typeof(IFoo).IsAssignableFrom(foo.GetType())确实不能,但是当我想要限制我的集合时,我总是使用type()的扩展方法。看这里,嗯,这是接受实例吗?不是
类型
??(顺便说一句,应该是
,其中T:IFoo
)。OP说的是猫和狗,而不是其他任何东西。好吧,不管怎么解释。。您的答案仍然是接受IMO的实例,而不是
类型
。这就是OP在问题中的“意思”。类型约束是问题的关键。不可能将非实例作为参数传递。
if (!foos.Any(t => t.GetInterfaces().Contains(typeof(IFoo)))
   throw new ArgumentException(...);
public void MyMethod<T>(T theType) where T : List<Cat>, List<Dog>
public static void MyMethod<T>(Type theType) where T : ICat {}

ICat icat = new Class2();

//This will not work because its the wrong type
IDog idog = new Class2();

MyMethod<ICat>(icat.GetType());