6

嗨,我正在努力实现这样的目标;

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

如果我能成功,那么我可以访问这个表达式并获取 GetData 方法并将其用于创建动态 sql 查询。我可以通过将方法名称作为字符串给出来做到这一点,但是我不想破坏我的开发者朋友的强类型世界。

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

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

你有想法吗?

4

2 回答 2

6

不幸的是,几乎没有“代表”这样的东西。对于大多数目的(尤其是:解析 a 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);
于 2012-07-31T07:30:34.877 回答
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));
}
于 2012-07-31T07:29:18.203 回答