Обнаружение, реализует ли тип универсальный интерфейс

Нет ничего неправильно с примером, который Вы дали. Но я должен сказать, что полагаю, что не эффективно сохранить функциональные определения в cpp файле. Я только понимаю потребность разделить объявление и определение функции.

, Когда используется вместе с явным инстанцированием класса, Библиотека проверки понятия повышения (BCCL) может помочь Вам генерировать шаблонный код функции в cpp файлах.

54
задан Community 23 May 2017 в 01:46
поделиться

5 ответов

// this conditional is necessary if myType can be an interface,
// because an interface doesn't implement itself: for example,
// typeof (IList<int>).GetInterfaces () does not contain IList<int>!
if (myType.IsInterface && myType.IsGenericType && 
    myType.GetGenericTypeDefinition () == typeof (IList<>))
    return myType.GetGenericArguments ()[0] ;

foreach (var i in myType.GetInterfaces ())
    if (i.IsGenericType && i.GetGenericTypeDefinition () == typeof (IList<>))
        return i.GetGenericArguments ()[0] ;

Изменить: Даже если myType реализует IDerivedFromList <> , но не напрямую IList <> , IList <> будет отображаться в массиве, возвращаемом GetInterfaces () .

Обновление:

83
ответ дан 7 November 2019 в 07:58
поделиться
Type[] typeArray2 = c.GetInterfaces();
for (int num2 = 0; num2 < typeArray2.Length; num2++)
{
     if (this == typeArray2[num2])
     {
          return true;
     }
}

- http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx

0
ответ дан 7 November 2019 в 07:58
поделиться

Используя отражение (и немного LINQ), вы можете легко сделать это:

public static IEnumerable<Type> GetIListTypeParameters(Type type)
{
    // Query.
    return
        from interfaceType in type.GetInterfaces()
        where interfaceType.IsGenericType
        let baseInterface = interfaceType.GetGenericTypeDefinition()
        where baseInterface == typeof(IList<>)
        select interfaceType.GetGenericArguments().First();
}

Во-первых, вы получаете интерфейсы по типу и фильтруете только те, которые являются универсальным типом.

] Затем вы получаете определение универсального типа для этих типов интерфейса и проверяете, совпадает ли оно с IList <> .

Отсюда легко получить общие аргументы для исходного интерфейс.

Помните, что у типа может быть несколько IList реализаций, поэтому возвращается IEnumerable .

11
ответ дан 7 November 2019 в 07:58
поделиться

Если я правильно понимаю ваш вопрос, это то, что вы пытаетесь сделать. Если нет, объясните подробнее.

public class MyType : ISomeInterface
{
}

MyType o = new MyType();

if(o is ISomeInterface)
 {
 }

edit: если вы измените свой вопрос, добавьте, пожалуйста, тот факт, что вы редактировали ... потому что теперь мой ответ выглядит так, как будто он не принадлежит.

В этом случае, здесь является очень большим LINQ

            var item = typeof(MyType).GetInterfaces()
                            .Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IList<>))
                            .Select(t => t.GetGenericArguments().First())
                            .FirstOrDefault();

if( item != null )
 //it has a type
0
ответ дан 7 November 2019 в 07:58
поделиться

As a helper method extension

public static bool Implements<I>(this Type type, I @interface) where I : class  
{
    if(((@interface as Type)==null) || !(@interface as Type).IsInterface)
        throw new ArgumentException("Only interfaces can be 'implemented'.");

    return (@interface as Type).IsAssignableFrom(type);
}

example usage:

var testObject = new Dictionary<int, object>();
result = testObject.GetType().Implements(typeof(IDictionary<int, object>)); // true!
1
ответ дан 7 November 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: