我有这样的代码有没有办法处理未知的泛型类型?
public interface IConsumable<T> {
void Consume(T item);
}
public interface IProducer<T> {
IConsumable<T> Consumer { get; set; }
void Produce();
}
public class MyClass : MyType,
IConsumable<ISpecifcItem>
{
public void Consume(ISpecificItem item) { ... }
}
public class MySpecificItemProducer
: IProducer<ISpecificItem> {
public IConsumable<ISpecificItem> Consumer { get; set; }
public void Produce() {
ISpecificItem myItem = new MyVerySpecificItem();
Consumer.Consume(myItem);
}
}
然后我有一个控制器,它采取任何MyType
,发现各类IConsumable<>
它实现并得到泛型类型参数的类型。有了这个类型列表,它可以发现实现IProducer<TParam>
的所有生产者。这并不难:
var consumerTypes =
myType.GetType().GetInterfaces()
.Where(x => x.IsGenericType)
.Where(x => x.GetGenericTypeDefinition() ==
typeof(IConsumable<>));
if (consumerTypes.Any()) {
var instanceTypes = consumerTypes
.Select(x => x.GetGenericArguments().First())
.Select(x => typeof(IProducer<>).MakeGenericType(x));
// for each of those types discover classes where
// it assignable from
// and instantiate the class using the Activator
}
但问题是,我该如何设置生产者的消费者属性?生产者实例对我来说是一个对象,我不能将它转换为IProducer<T>
,因为我不能像变量那样使用T.
我可以用反射producerInstance.GetType().GetProperty("Consumer").SetValue(producerInstance, consumerInstance, null);
但我想知道是否有另一种方式吗?
有趣的是,这并没有在运行时:
MyClass consumerInstance;
dynamic test = producerInstance;
test.Consumer = consumerInstance;
这抱怨那consumerInstance的类型是不兼容的属性的类型。
编辑:动态例子只是工作时,consumerInstance也是一个动态的,例如:
dynamic testC = consumerInstance;
dynamic testP = producerInstance;
testP.Consumer = testC;
您的动态代码适合我。 – Ani 2012-03-01 12:09:59
嗯好吧,我只是试过一次,也许别的东西。 – Andreas 2012-03-01 13:22:53
我跟进了这个动态的例子,发现它在我让受让人也是动态的时候起作用。 – Andreas 2012-03-11 21:03:03