私は次の型階層を持っている:C#Create.Delegateは継承をサポートしていますか?
public abstract class Parent { }
public class Child : Parent
{
public Task SayAsync(string arg)
{
Console.WriteLine(arg);
return Task.CompletedTask;
}
}
私は次のことを達成する必要があります。
- (これはすでに私が入手
Func<Parent>
を呼び出すことによって解決され、実行時にParent
の任意のインスタンスを作成します。 - のすべてのメソッド(その場合は常に
Task
を返し、string
を受け入れる)を呼び出して、を渡します。は定数ではありません。
は、上記のため、私は私がその後、キャッシュし、必要なときに使用しますデリゲートを作成することになりますので、起動時にCached Delegates
に頼らい性能を向上させるために、ホット・パスに存在します。 私が明示的に行った例ですが、デリゲートがParent
を受け入れる方法を理解できません(コンパイル時に型が分からないため)。
// If I change Child to Parent, I get "Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type"
private delegate Task Invoker(Child instance, string arg);
void Main()
{
var instance = new Child(); // This will be obtained by calling a Func<Parent>
var methodWithArg = instance.GetType().GetMethod("SayAsync");
var func = GetDelegateWithArg(methodWithArg);
func(instance, "Foo");
}
private static Invoker GetDelegateWithArg(MethodInfo method)
{
object pointer = null;
return (Invoker)Delegate.CreateDelegate(typeof(Invoker), pointer, method);
}
私が目標を達成するのに役立つアイデアや代替案がありがたいです。あなたが代わりに式ツリーを使用してデリゲートを生成しようとすることができます
!実際には、アセンブリを[ここ](http://stackoverflow.com/a/5160513/1226568)から取った '[assembly:SecurityTransparent]'としてマーキングすることで余分なオーバーヘッドを補うことができました。 CreateDelegate' version :-) – MaYaN