0

我正在尝试传递一个描述方法的表达式,但我希望参数是强类型的,我不想知道方法签名或传递表达式中的参数,如下所示:

GetMethod<MyClass>(c => c.DoSomething);

哪里DoSomething可以有这样的方法签名......string DoSomething(int id, int count)

我知道我可以做这样的事情:

MemberInfo GetMethod<T>(Expression<Func<T, Delegate>> expression);

//implementation
GetMethod<MyClass>(c => new Func<int, int, string>(c.DoSomething))

但坦率地说,这很丑陋。

这可能吗?

4

1 回答 1

4

只需为每个可能的 Action/Func 设置一个重载。它不会涵盖所有可能性(有一个额外的重载,你已经在那里展示了涵盖所有边缘情况),但它会处理其中的大部分。

每个动作/函数重载的主体都可以调用上面显示的用于实际实现的重载。

public MemberInfo GetMethod<T1, T2>(Expression<Func<T1, Func<T2>>> expression)
{
    return GetMethodImpl(expression);
}

public MemberInfo GetMethod<T1, T2, T3>(Expression<Func<T1, Func<T2, T3>>> expression)
{
    return GetMethodImpl(expression);
}

public MemberInfo GetMethod<T1, T2>(Expression<Func<T1, Action<T2>>> expression)
{
    return GetMethodImpl(expression);
}

//...

GetMethodImpl然后可以像这样实现:

private MemberInfo GetMethodImpl<T1, T2>(Expression<Func<T1, T2>> expression)
{

}

这将能够只是对现有GetMethod实现的轻微修改。 T2将成为您的代表;您可能需要将其转换为Delegate,具体取决于您如何使用它。

于 2013-05-21T14:49:59.960 回答