从接口调用“ IsAssignableFrom”不会返回具体的类 [英] Calling 'IsAssignableFrom' from an interface doesn't return the concrete class

查看:187
本文介绍了从接口调用“ IsAssignableFrom”不会返回具体的类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to return the object type of the class that implements the interface defined in the code below.

linq语句仅返回接口本身,因此控制台输出为:

The linq statement only returns the interface itself, and so the console output is just:


AssignableExperiment.IRule

AssignableExperiment.IRule

为什么不返回具体的类?

Why isn't the concrete class being returned?

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


推荐答案

您应该绕过 IsAssignableFrom MSDN 。因为 IsAssignableFrom 可以按照预期的另一种方式工作: BaseType.IsAssignableFrom(DerviedType)返回true。

You should turn it around the IsAssignableFrom MSDN. Because IsAssignableFrom works another way around as expected: BaseType.IsAssignableFrom(DerviedType) returns 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;

这篇关于从接口调用“ IsAssignableFrom”不会返回具体的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆