目标:传递行动< T>要运行的方法。我们的想法是,如果方法使用T,那么我们可以指定我们将作为参数传递给方法的类型,而不是必须使用动态。
问题:我无法获取参数值,最好的方法是什么(最有可能使用反射)?
代码:
public static void RunVoidMethod<T>(Action<T> methodToRun)
{
try
{
// Below is a ParameterInfo, I want the parameter value for methodToRun
var parameterValue = methodToRun.Method.GetParameters()[0];
methodToRun(parameterValue);
}
catch (Exception e)
{
throw;
}
}
最糟糕的情况是我可以添加一个可选参数,该参数也可以是T类型,但我希望尽可能避免这种情况。
答案 0 :(得分:4)
也许你正在寻找这样的事情(我不是100%肯定,因为你的帖子没有真正包含一个问题,只是一个声明)。
public static void RunVoidMethod<T>(Action<T> methodToRun, T param)
{
try
{
methodToRun(param);
}
catch (Exception e)
{
throw;
}
}
答案 1 :(得分:1)
我并不是真的理解以这种方式使用委托的目的,但即使你这样做,你总是可以使用委托来调用接受参数的方法。
static void Main(string[] args)
{
PrintTest(() => DelegateTest("Hello"));
}
public static void DelegateTest(string test)
{
Console.WriteLine(test);
throw new ArgumentException();
}
public static void PrintTest(Action action)
{
try
{
action.Invoke();
}
catch (Exception w)
{
throw;
}
}
否则,MSDN上有一篇文章解释了如果在运行时之前不知道Type,那么如何调用委托:https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/how-to-hook-up-a-delegate-using-reflection