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());