【问题标题】:How to pass in a list of System.Type into a method?如何将 System.Type 列表传递给方法?
【发布时间】:2015-01-25 01:19:58
【问题描述】:

我正在尝试将System.Type 的列表传递给一个方法。不是实例,而是Type's。

现在有一个问题:我希望通过接口限制Type

例如,假设我有这个......

public interface IFoo
public class Cat : IFoo
public class Dog : IFoo

然后这个..

public void MyMethod(IEnumerable<Type> foos) 但只允许 Cat's 和 Dog's 而不是其他任何东西。

通常,我这样做:public void MyMethod(IEnumberable<IFoo> foos) 但那是要求一些 foo instances,这不是我想要做的。

【问题讨论】:

  • 很遗憾你不能。但是在运行时你可以检查你得到了正确的东西,例如。 typeof(IFoo).IsAssignableFrom(foo.GetType())
  • 确实不能,但是当我想限制我的收藏时,我总是使用扩展方法 OfType()。看这里stackoverflow.com/questions/17263768/…

标签: c# .net


【解决方案1】:

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

public void MyMethod(IEnumerable<IFoo> foos) { ... }

更新

无法声明该方法只接受实现interfaceTypes 列表。您需要在自己的代码中进行验证。

if (!foos.Any(t => t.GetInterfaces().Contains(typeof(IFoo)))
   throw new ArgumentException(...);

【讨论】:

  • 不。我刚刚在你回答这个问题时编辑了我的问题:)
  • 我建议if (foos.Any(t =&gt; !t.IsAssignableFrom(typeof(IFoo)))) { /* blow up */ }
  • @rossipedia 两者都可以,但是您需要删除第一个 !
  • 答案不仅限于猫和狗
【解决方案2】:
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());

【讨论】:

    【解决方案3】:
    public void MyMethod<T>(T theType) where T : List<Cat>, List<Dog>
    

    【讨论】:

    • 嗯 - 这是接受 instances 吗?不是Type的?? (顺便说一下,应该是where T : IFoo)。
    • OP 说的是猫和狗,而不是别的。
    • 好吧,不管解释如何......你的答案仍然是接受 instances IMO 而不是 Type's。
    • 这就是问题的“意思”。类型约束是问题的症结所在。不能将非实例作为参数传递。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2013-11-06
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多