使用Action <object>作为方法输入</object>

时间:2014-02-20 14:06:20

标签: c#

我的情况是我希望有一个方法可以采用其他方法作为输入。

输入法总是有一个对象作为输入,但对象是不同的。

这或多或少是我需要做的事情:

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)或其他任何内容。

3 个答案:

答案 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)