Вызов IsAssignableFrom из интерфейса не возвращает конкретный класс - PullRequest
7 голосов
/ 16 ноября 2011

Я пытаюсь вернуть тип объекта класса, который реализует интерфейс, определенный в коде ниже.

Оператор 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 ]

10 голосов
/ 16 ноября 2011

Вы должны повернуть его вокруг 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;
7 голосов
/ 16 ноября 2011

Я ненавижу IsAssignableFrom, это так гнусно написано.

Я всегда свертываю расширение:

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

Использование этого предотвращает коварное ошибочное исполнение.

Тогда вы могли бы написать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...