у меня есть интерфейс
public interface ISomething<TValue>
where TValue : IConvertible
{
...
}
Затем у меня также есть некоторый необщий класс с универсальным методом:
public class Provider
{
public static void RegisterType<TValue>(ISomething<TValue> instance)
where TValue : IConvertible
{
...
}
}
Кажется, все в порядке, пока я не захочу автоматически зарегистрировать все применимые типы в моей конкретной сборке.
public void InitializeApp()
{
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(ISomething<>).IsAssignableFrom(T)))
{
// ERROR
Provider.RegisterType(Activator.CreateInstance(t));
}
}
Этот код приводит к ошибке, поскольку тип аргумента нельзя вывести из использования. я должен либо
- предоставить явный универсальный тип с помощью моего универсального метода
RegisterType
(я не думаю, что смогу это сделать из-за динамического характера моего кода) или - привести результаты из
Activator.CreateInstance
к соответствующему типу, чтобы тип аргумента можно было вывести из использования
Но я тоже не знаю, как быть? Может быть, есть третий вариант, о котором я не знаю.
RegisterType
через отражение иMakeGenericMethod
? Либо так, либо вы, вероятно, должны иметь неуниверсальнуюISomething
и перегрузкуRegisterType
, которая использует это. - person Kirk Woll   schedule 03.06.2014