我的情况是我希望有一个方法可以采用其他方法作为输入。
输入法总是有一个对象作为输入,但对象是不同的。
这或多或少是我需要做的事情:
public static void takeAnything(Action<object> inputFunc)
{
Console.WriteLine(inputFunc.Method.Name);
}
public static void test1(MyOwnObject input){
// Do stuff with input object
}
public static void test2(MyOtherOwnObject input){
// Do stuff with input object
}
public static void startSystem(){
takeAnything(test1);
takeAnything(test2);
}
在这个虚拟案例中会写出:
test1
test2
我无法让这个工作,所以任何帮助都会非常感激。
修改
我不知道这是否可行,也许不是,但重要的是呼叫只是takeAnything(test1)
,而不是takeAnything<MyOwnObject>(test1)
或其他任何内容。
答案 0 :(得分:5)
使您的方法通用
public static void TakeAnything<T>(Action<T> inputFunc)
{
Console.WriteLine(inputFunc.Method.Name);
}
当然,您只能传递具有单个输入参数的方法。
更新:遗憾的是,当您将方法组传递给方法时,C#无法从使用情况推断出动作通用参数类型,因此只有使用它的方法是手动指定通用参数类型
takeAnything<MyOwnObject>(test)
有关详细信息,请参阅问题C# 3.0 generic type inference - passing a delegate as a function parameter
答案 1 :(得分:0)
试试这个,这样你就可以将动态参数传递给action:
public static void takeAnything(Expression<Action> inputFunc)
{
var currentMethod = ((MethodCallExpression)inputFunc.Body);
Console.WriteLine(currentMethod.Method.Name);
}
public static void test(MyOwnObject input){
// Do stuff with input object
}
public static void startSystem(){
MyOwnObject yourObject = new MyOwnObject();
takeAnything(() => test(yourObject));
}
答案 2 :(得分:-1)
为什么不将takeAnything
方法的标题更改为:
public static void takeAnything(Action<MyOwnObject> inputFunc)