Вы можете попробовать это, используя универсальный метод для типа предоставленного параметра.
Это не гарантирует, что TParam и T одинаковы, так как у вас не универсальный интерфейс, но он лучшийможет сделать, как я знаю, в соответствии с первым исследованием вашей проблемы ...
Потому что в C # нет оператора с бриллиантом, который позволял бы истинный общий полиморфизм для открытых типов.
public interface IB
{
void Foo<TParam>(TParam parameter);
}
public class B<T> : IB
{
public void Foo<TParam>(TParam parameter)
{
var param = parameter;
Console.WriteLine("param type: " + param.GetType().Name);
}
}
public class A
{
private IEnumerable<IB> CollectionOfBs;
public A(IEnumerable<IB> collectionOfBs)
{
CollectionOfBs = collectionOfBs;
}
public void Foo(IEnumerable<object> param)
{
if ( param.Count() < CollectionOfBs.Count() )
throw new ArgumentException();
for ( int i = 0; i < CollectionOfBs.Count(); i++ )
CollectionOfBs.ElementAt(i).Foo(param.ElementAt(i));
}
}
Метод испытания
static void Test()
{
var listInstances = new List<IB> { new B<int>(), new B<double>(), new B<string>() };
var container = new A(listInstances);
var listParams = new List<object> { 2, 4.3, "test" };
container.Foo(listParams);
}
Выход
param type: Int32
param type: Double
param type: String
Соображения
Проблема здесьчто любой тип параметра с плохим соответствием может быть передан.
Например, с помощью Test () у вас может быть двойное число вместо первого целого числа, и это работает: вы получаете Double на вашем экземпляре Int32 ...
param type: Double
param type: Double
param type: String
Имея оператор Diamond <>
, вы сможете использовать общий интерфейс и анализировать закрытый список созданных типов ... и ваш дизайн будет лучше пахнуть:
public interface IB<T>
{
void Foo(T parameter);
}
public class B<T> : IB<T>
{
public void Foo(T parameter)
{
var param = parameter;
Console.WriteLine("param type: " + param.GetType().Name);
}
}
public class A
{
private IEnumerable<IB<>> CollectionOfBs;
public A(IEnumerable<IB<>> collectionOfBs)
{
CollectionOfBs = collectionOfBs;
}
public void Foo(IEnumerable<object> param)
{
if ( param.Count() < CollectionOfBs.Count() )
throw new ArgumentException();
for ( int i = 0; i < CollectionOfBs.Count(); i++ )
{
CollectionOfBs.ElementAt(i).Foo(param.ElementAt(i));
}
}
}
Следовательно, при этом любой неверно соответствующий тип параметра будетЯ выдвигаю исключение во время выполнения.