Предположим, у меня есть List<IMyInterface>
...
У меня есть три класса, которые реализуют IMyInterface
: MyClass1
, MyClass2
и MyClass3
У меня естьТолько для чтения Словарь:
private static readonly Dictionary<Type, Type> DeclarationTypes = new Dictionary<Type, Type>
{
{ typeof(MyClass1), typeof(FunnyClass1) },
{ typeof(MyClass2), typeof(FunnyClass2) },
{ typeof(MyClass3), typeof(FunnyClass3) },
};
У меня есть другой интерфейс, IFunnyInteface<T> where T : IMyInterface
У меня есть метод:
public static IFunnyInterface<T> ConvertToFunnyClass<T>(this T node) where T : IMyInterface
{
if (DeclarationTypes.ContainsKey(node.GetType())) {
IFunnyInterface<T> otherClassInstance = (FunnyInterface<T>) Activator.CreateInstance(DeclarationTypes[node.GetType()], node);
return otherClassInstance;
}
return null;
}
Я пытаюсь вызвать конструктор FunnyClassesи вставьте в качестве параметра мой объект MyClass.Я не хочу знать, какой это объект: я просто хочу создать экземпляр FunnyClass с MyClass в качестве параметра.
Что происходит, когда я вызываю ConvertToFunnyClass, T
имеет тип IMyInterface
, и когдаЯ пытаюсь привести его к FunnyInterface<T>
, он говорит, что я не могу конвертировать FunnyClass1
, например, в FunnyInterface<IMyInterface>
Мой текущий обходной путь (не красивый), это:
public static dynamic ConvertToFunnyClass<T>(this T node) where T : IMyInterface
{
if (DeclarationTypes.ContainsKey(node.GetType())) {
var otherClassInstance = (FunnyInterface<T>) Activator.CreateInstance(DeclarationTypes[node.GetType()], node);
return otherClassInstance;
}
return null;
}
И мне это не нравится, потому что тип возвращаемого значения dynamic
, поэтому, когда я получаю к нему доступ откуда-то еще, я понятия не имею, какой это тип, и я теряю intellisense и прочее.Я не знаю ни о каких последствиях для производительности.
Есть какие-нибудь подсказки?
Заранее спасибо!
Разрешение
КакЯ использую C # 4.0, я мог прекратить приводить ошибки, используя ковариацию (только выходные позиции), и поэтому я изменил свой IFunnyInterface
на
IFunnyInteface<out T> where T : IMyInterface
Спасибо всем за ответы.