【问题标题】:Calling 'IsAssignableFrom' from an interface doesn't return the concrete class从接口调用“IsAssignableFrom”不会返回具体类
【发布时间】:2011-11-16 04:16:38
【问题描述】:

我正在尝试返回实现下面代码中定义的接口的类的对象类型。

linq 语句只返回接口本身,所以控制台输出只是:

AssignableExperiment.IRule

为什么没有返回具体类?

using System;
using System.Linq;

namespace AssignableExperiment
{
    public interface IRule
    {
        void Validate(string s);
    }

    public class ConcreteRule : IRule
    {
        public void Validate(string s)
        {
           // some logic
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var ruleType = typeof(IRule);

            var ruleTypes = from t in ruleType.Assembly.GetTypes()
                            where t.IsAssignableFrom(ruleType)
                            select t;

            foreach (var type in ruleTypes)
            {
                Console.WriteLine(type);
            }

            Console.ReadLine();
        }
    }
}

【问题讨论】:

    标签: c# inheritance .net-4.0


    【解决方案1】:

    你应该把它转过来IsAssignableFromMSDN。因为IsAssignableFrom 按预期的另一种方式工作:BaseType.IsAssignableFrom(DerviedType) 返回 true。

    var ruleTypes = from t in ruleType.Assembly.GetTypes()
                                where ruleType.IsAssignableFrom(t)
                                select t;
    

    如果你不想回IRule

    var ruleTypes = from t in ruleType.Assembly.GetTypes()
                                where ruleType.IsAssignableFrom(t) && t != ruleType
                                select t;
    

    【讨论】:

      【解决方案2】:

      我讨厌 IsAssignableFrom,它写得太邪恶了。

      我总是滚动扩展:

      public static bool IsTypeOf<T>(this Type type)
      {
          return typeof (T).IsAssignableFrom(type);
      }
      

      使用它可以防止阴险的错误执行。

      那么你可以写:

      var ruleTypes = ruleType.Assembly.GetTypes().Where(t=&gt; t.IsTypeOf&lt;IRule&gt;());

      【讨论】:

      • 目前我的项目中只有一个地方需要它,所以我将省略通用助手,谢谢您的回答。
      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2016-03-15
      • 1970-01-01
      • 2010-10-04
      • 2017-11-21
      • 2016-07-18
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多