C# 在不知道方法签名的情况下从表达式中获取MethodInfo

C# 在不知道方法签名的情况下从表达式中获取MethodInfo,c#,lambda,expression,C#,Lambda,Expression,我试图传递一个描述方法的表达式,但我希望参数是强类型的,我不想知道方法签名或在表达式中传递参数,类似这样: GetMethod<MyClass>(c => c.DoSomething); MemberInfo GetMethod<T>(Expression<Func<T, Delegate>> expression); //implementation GetMethod<MyClass>(c => new Func&l

我试图传递一个描述方法的表达式,但我希望参数是强类型的,我不想知道方法签名或在表达式中传递参数,类似这样:

GetMethod<MyClass>(c => c.DoSomething);
MemberInfo GetMethod<T>(Expression<Func<T, Delegate>> expression);

//implementation
GetMethod<MyClass>(c => new Func<int, int, string>(c.DoSomething))
但坦率地说,这是相当丑陋的


这可能吗?

只需为每个可能的操作/功能设置一个重载即可。它不会覆盖所有的可能性(有一个额外的重载,您已经在那里展示了它可以覆盖所有的边缘情况),但它可以处理大多数情况

每个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);
}

//...

这将只是对现有的
GetMethod
实现的一个小小修改
T2
将是您的代表;您可能需要将其强制转换为委托,具体取决于您使用它的方式。

只需为每个可能的操作/功能设置一个重载即可。它不会覆盖所有的可能性(有一个额外的重载,您已经在那里展示了它可以覆盖所有的边缘情况),但它可以处理大多数情况

每个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);
}

//...

这将只是对现有的
GetMethod
实现的一个小小修改
T2
将是您的代表;您可能需要将其转换为
委托
,具体取决于您如何使用它。

我正在寻找更具可扩展性的工具。可能有几十个(如果不是几百个)不同的方法签名。@bflemi3只有16个?Func和Action的重载各不相同。这是一个有限的列表。泛型有助于处理将其扩展到巨大级别的排列。只要你没有超过16个参数的方法,这不是一个大问题。它不会处理任何带有
ref
/
out
参数、可选参数、
params
参数的方法,或者可能处理一些其他边缘情况。对于那些你将需要使用你在OP中展示的方法,因为仅仅为他们处理特殊重载可能不值得。你介意给我一个快速的实现示例吗?我猜使用
字符串DoSomething(int id,int count)
@bflemi3实现就是您必须首先实现的。其思想是,这样可以代表调用方确保编译时的安全性,但随后会将强类型委托变成一个
委托
,并执行您之前所做的任何操作。我不知道那是什么。我很困惑,上面的哪个签名与我的实现相匹配?我正在寻找更具可扩展性的东西。可能有几十个(如果不是几百个)不同的方法签名。@bflemi3只有16个?Func和Action的重载各不相同。这是一个有限的列表。泛型有助于处理将其扩展到巨大级别的排列。只要你没有超过16个参数的方法,这不是一个大问题。它不会处理任何带有
ref
/
out
参数、可选参数、
params
参数的方法,或者可能处理一些其他边缘情况。对于那些你将需要使用你在OP中展示的方法,因为仅仅为他们处理特殊重载可能不值得。你介意给我一个快速的实现示例吗?我猜使用
字符串DoSomething(int id,int count)
@bflemi3实现就是您必须首先实现的。其思想是,这样可以代表调用方确保编译时的安全性,但随后会将强类型委托变成一个
委托
,并执行您之前所做的任何操作。我不知道那是什么。我很困惑,上面哪个签名与我的实现相匹配?