私はその後、私はどんなMyType
をとるコントローラを持っています。このコード未知のジェネリック型を扱う方法はありますか?
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);
}
}
を持って、それがジェネリック型パラメータの種類を実装し、取得すること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
}
しかし、問題は、私はどのようにプロデューサーのコンシューマープロパティを設定するのですか?プロデューサのインスタンスは私にとってはオブジェクトなので、変数のようにTを使うことができないので、IProducer<T>
にキャストできません。
私は反射でそれを行うことができますproducerInstance.GetType().GetProperty("Consumer").SetValue(producerInstance, consumerInstance, null);
しかし、別の方法があるかどうかを知りたかったですか?
興味深いことに、これは実行時に失敗しました:それはconsumerInstanceのタイプは、プロパティの型に互換性がなかったと訴え
MyClass consumerInstance;
dynamic test = producerInstance;
test.Consumer = consumerInstance;
。
EDIT:consumerInstanceも例えば、ダイナミックだったときの動的例にのみ働いた:
dynamic testC = consumerInstance;
dynamic testP = producerInstance;
testP.Consumer = testC;
動的コードがうまく動作します。 – Ani
ええええええええええええええええええええええええええええええええええええええええええええええええと、 – Andreas
私は動的サンプルをフォローし、譲受人を動的にしたときにそれが働いていることを発見しました。 – Andreas