こんにちは私は同じ戻り値とパラメータとして受け取るMethodInfoと同じパラメータを持つ代理人を動的に作成する関数を作成しようとしており、これは同じパラメータ名!私がこれまでにやったパラメータ名を使用して代理人を動的に作成する
は同じパラメータ型を受け取り、METHODINFOと同じ戻り値を持つラムダを返す関数を作成することですが、それはパラメータ名を持っていない:
static void Example()
{
Person adam = new Person();
MethodInfo method = typeof(Person).GetMethod("Jump");
Delegate result = CreateDelegate(adam, method);
result.DynamicInvoke((uint)4, "Yeahaa");
}
private static Delegate CreateDelegate(object instance, MethodInfo method)
{
var parametersInfo = method.GetParameters();
Expression[] expArgs = new Expression[parametersInfo.Length];
List<ParameterExpression> lstParamExpressions = new List<ParameterExpression>();
for (int i = 0; i < expArgs.Length; i++)
{
expArgs[i] = Expression.Parameter(parametersInfo[i].ParameterType, parametersInfo[i].Name);
lstParamExpressions.Add((ParameterExpression)expArgs[i]);
}
MethodCallExpression callExpression = Expression.Call(Expression.Constant(instance), method, expArgs);
LambdaExpression lambdaExpression = Expression.Lambda(callExpression, lstParamExpressions);
return lambdaExpression.Compile();
}
private class Person
{
public void Jump(uint height, string cheer)
{
Console.WriteLine("Person jumped " + height + " "+ cheer);
}
}
んどのように私はそれを行うことができます誰も提案がありますか? 私がパラメータ名を気にする理由は、私がパラメータ名でデリゲートをアクティブにすることができるので、私はこのように呼び出すことができる(cheer = "YAY!"、height = 3) 私のアプリケーションはPythonに統合されているので、DynamicInvokeを使わないとどうやってやることができるのでしょうか?また、パラメータ名が非常に重要な理由です。 と '='と ':'を書かなかった理由)
はありがとう、私は今日早く試してみました。 私はあなたのコードの大部分を理解していますが、名前と名前で何をしているのか分かりませんでした。タイプベースの名前+タイプの名前と等しいのはなぜですか? どうもありがとうございました –
@UchihaMadara、同じアセンブリ内で同じ名前の2つの型を持つことができないので、型名が一意であることを確認する方法です。そして、2番はそこにありますので、名前は 'PersonJump'、' PersonJump2'、 'PersonJump3'などのようになります。 – svick
私はそれがとてもスマートだと思っています、ありがとう! =] –