現在、MethodInfo
からデリゲートを作成しようとする問題が発生しています。私の全体的な目標は、クラスのメソッドを調べ、特定の属性でマークされたデリゲートを作成することです。 CreateDelegate
を使用しようとしていますが、次のエラーが発生します。
署名またはセキュリティの透過性がデリゲート型のものと互換性がないため、ターゲットメソッドにバインドできません。
これが私のコードです
public class TestClass
{
public delegate void TestDelagate(string test);
private List<TestDelagate> delagates = new List<TestDelagate>();
public TestClass()
{
foreach (MethodInfo method in this.GetType().GetMethods())
{
if (TestAttribute.IsTest(method))
{
TestDelegate newDelegate = (TestDelagate)Delegate.CreateDelegate(typeof(TestDelagate), method);
delegates.Add(newDelegate);
}
}
}
[Test]
public void TestFunction(string test)
{
}
}
public class TestAttribute : Attribute
{
public static bool IsTest(MemberInfo member)
{
bool isTestAttribute = false;
foreach (object attribute in member.GetCustomAttributes(true))
{
if (attribute is TestAttribute)
isTestAttribute = true;
}
return isTestAttribute;
}
}
instanceメソッドからデリゲートを作成しようとしていますが、ターゲットを渡していません。
あなたは使うことができます:
Delegate.CreateDelegate(typeof(TestDelagate), this, method);
...または、メソッドを静的にすることができます。
(両方の種類のメソッドに対処する必要がある場合は、条件付きでそれを行うか、中央の引数としてnull
を渡す必要があります。)
ターゲットがない場合は、デリゲートに別の署名が必要です。次にターゲットを最初の引数として渡す必要があります
public class TestClass
{
public delegate void TestDelagate(TestClass instance, string test);
private List<TestDelagate> delagates = new List<TestDelagate>();
public TestClass()
{
foreach (MethodInfo method in this.GetType().GetMethods())
{
if (TestAttribute.IsTest(method))
{
TestDelegate newDelegate = (TestDelagate)Delegate.CreateDelegate(typeof(TestDelagate), null, method);
delegates.Add(newDelegate);
//Invocation:
newDelegate.DynamicInvoke(this, "hello");
}
}
}
[Test]
public void TestFunction(string test)
{
}
}