从接口调用'IsAssignableFrom'不会返回具体类

时间:2011-11-15 20:07:06

标签: c# inheritance .net-4.0

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

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

2 个答案:

答案 0 :(得分:10)

你应该绕着IsAssignableFrom MSDN转过来。因为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;

答案 1 :(得分:7)

我讨厌IsAssignableFrom,它是如此邪恶的写作。

我总是推广扩展名:

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

使用此功能可以防止执行不正确的错误。

然后你可以写:

var ruleTypes = ruleType.Assembly.GetTypes().Where(t=> t.IsTypeOf<IRule>());