返回委托的Lambda表达式

时间:2012-07-31 07:18:29

标签: c# .net delegates lambda expression

嗨,我想尝试这样的事情;

Method<TObjectType>(m=>m.GetData); //m is the instance of TObjectType

如果我能成功,那么我可以访问此表达式并获取GetData方法并使用它来创建动态sql查询。我可以通过将方法名称作为字符串来实现,但我不想打破开发人员朋友的强类型世界。

我知道我必须给出代表的确切定义,但这对我没有帮助;

void Method<TObjectType>(Expression<Func<TObjectType, Delegate>> ex){/**/}

你有什么想法吗?

2 个答案:

答案 0 :(得分:6)

不幸的是,几乎没有“代表”这样的事情。对于大多数目的(尤其是:用于解析MethodInfo),它必须是强类型委托。这是因为GetData不是方法,它是方法组。你真的需要精确地指定方法,或者有一个已知的委托类型(最终做同样的事情)。

你有两个实用的选择;工作到object,或添加通用。例如:

void Method<TObjectType>(Expression<Func<TObjectType,object>> ex) {...}

会起作用,如下:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,TValue>> ex) {...}

来电者将使用:

Method<Foo>(x => x.GetData());

如果您确实想要使用委托,则该类型必须是可预测的,例如:

void Method<TObjectType>(Expression<Func<TObjectType,Func<int>>> ex)

允许:

Method<Foo>(x => x.GetData);

或者,如果您知道(例如)该方法始终是无参数的,但您不知道返回类型;也许是这样的:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,Func<TValue>>> ex)

允许:

Method<Foo, int>(x => x.GetData);

答案 1 :(得分:0)

你在找这样的东西吗?

object InvokeMethod(Delegate method, params object[] args){
    return method.DynamicInvoke(args);
}

int Add(int a, int b){
    return a + b;
}

void Test(){
    Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4));
}