2015-09-24 2 views
0

Можно ли (в c#) сравнить открытый общий параметр, например. T в:Сравните открытый общий параметр с открытым общим интерфейсом типа

public void CompareMethod<T>() { ... } 

с типом открытого универсального интерфейса (или класса)?
Вот пример интерфейса:

public interface IExample<T> { } 

А потом как-то внутри метода сравнивать их, как это:

public void CompareMethod<T>() 
{ 
    if (typeof(IExample<>) == typeof(T)) 
    { 
     //execute 
    } 
} 

if тело не будет выполняться при вызове метода, как это:

CompareMethod<IExample<object>>(); 

Это important, что я не знаю заранее, es будут введены в открытый общий параметр CompareMethod.

+2

Почему вы используете параметр универсального типа, если вам нужно сравнить его 'параметр T'? Не могли бы вы уточнить, что вы пытаетесь сделать? –

+0

Я согласен с @YuvalItzchakov, это звучит как [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – juharr

+0

Я использую это в приложении WPF с использованием шаблона MVVM. У меня есть служба, которая показывает окна/диалоги, предоставляя тип ViewModel. Эти ViewModels реализуют некоторые интерфейсы. Я назначил ответственность за эту услугу за то, что она также выполняет некоторую дополнительную работу над некоторыми из этих режимов просмотра. Но эта дополнительная работа применяется только на выборочном наборе интерфейсов. – QuantumHive

ответ

1

Вам нужно позвонить GetGenericTypeDefinition() на T, чтобы иметь возможность сравнить его с IExample<>:

public void CompareMethod<T>() 
{ 
    if (typeof(T).IsGenericType && 
     typeof(T).GetGenericTypeDefinition() == typeof(IExample<>)) { 
    { 
     //execute 
    } 
} 
+0

Downvoter, объясните пожалуйста. – Steven

Смежные вопросы