たとえば、ネストされたクラスをジェネリックメソッドに渡して、そのすべてのクラスを評価しようとしています。
SharedClass.FindParentClass<GrandParent.Parent.Child>();
一般的な方法:
public void FindParentClass<T>() where T: ISomeInterface, new()
{
//Break down T to all of its classes
}
私はこれを避けたい:
SharedClass.FindParentClass<GrandParent,GrandParent.Parent,GrandParent.Parent.Child>();
上記のコードで機能する汎用メソッド:
public void FindParent<TGrandParent, TParent, TChild>() where TGrandParent : IGrandParent, new()
where TParent : IParent, new()
where TChild : IChild, new()
{
//all I have to do now is place the type parameters there where I want them
}
型パラメーターとして使用されているクラスを変更することは許可されていないため、すべてのクラスは異なるインターフェースを継承し、パブリックパラメーターのないコンストラクターを持っています。
意図したとおりに機能させるには、3つの型パラメーターすべてを受け入れる別の(プライベート)ジェネリックメソッドを作成する必要がありました。
private void PerformWith<GrandParent, Grandparent.Parent, GrandParent.Parent.Child>()
{
//Perform something
}
したがって、最初の一般的な方法では、リフレクションを使用して次のことを行います。
これは次のようになります。
public void FindParentClass<T> where T: ISomeInterface, new()
{
var parentClass = typeof(T).GetTypeInfo().ReflectedType;
var grandparentClass = parentClass.GetTypeInfo().ReflectedType;
var method = MethodBase.GetCurrentMethod().DeclaringType.GetMethod("PerformWith", BindingFlags.NonPublic());
var genericMethod = method.MakeGenericMethod(new Type[] { grandparentClass, parentClass, typeof(T) });
genericMethod.Invoke(null, null);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加