如何检查具有特定签名的C#中是否存在方法?

如何检查具有特定签名的C#中是否存在方法?,c#,overloading,C#,Overloading,我想检查是否实现了某些参数的方法。在这个场景中,我有以下方法重载: public class Transformations { public string TransformFrom(string s) { return s;} public string TransformFrom(int i) { return "00" + i.ToString();} public string TransformFrom(DateTime dt) { return

我想检查是否实现了某些参数的方法。在这个场景中,我有以下方法重载:

public class Transformations
{ 
    public string TransformFrom(string s) { return s;}
    public string TransformFrom(int i) { return "00" + i.ToString();}
    public string TransformFrom(DateTime dt) { return 
                       DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff");}
}
假设我有小数点,比如:

object obj = 1M;
如果我现在调用
TransformFrom(obj)
,我会得到一个异常

不幸的是,我的程序的另一部分只返回对象,它们实际上是像int或datetime这样的具体类型。我想将这些对象中的一些转换为字符串,以便可以将它们写入日志。所以这是一个运行时问题。我还希望我的Transformations类足够通用,可以在其他程序中使用,因此可以有任何类型的对象


有没有快速的方法来确定这个方法重载不存在?

无论哪种方法,您当前都会得到一个编译时错误,即使有一个接受小数的重载。根据您的需要,您可以采用以下两种方法之一:


要在编译时解决此问题,必须强制转换为正确的类型

object obj = 1;
var objAsInt = (int) obj;
var result = transformationInstance.TransformFrom(objAsInt);
如果没有适当的重载,您将得到一个编译时错误,您可以在设计时解决这个问题


要在运行时解决此问题,请使用反射来确定是否存在该类型的重载以及是否存在传递实例的情况

object obj = 1;
var underlyingType = obj.GetType();
var method = typeof(Transformations).GetMethod("TransformFrom", new Type[] { underlyingType });
if(method != null)
{
    var result = method.Invoke(transformationInstance, new []{obj});
}

可以使用反射来确定给定过载是否存在:

public static bool HasOverloadForArgument(Type targetType, string methodName, object arg)
{
    var methodInfo = targetType.GetMethod(name: methodName, types: new[] { arg.GetType() });
    return methodInfo != null;
}

我不确定这里的全部想法是什么,因为当转换在运行时不可用时,您将无法做很多事情

也许,您最好使用
dynamic
,以避免其他情况下所需的所有反射内容和缓存,例如

var boxedInt = (object)1;
var boxedFloat = (object)1f;
dynamic dynamicInt = boxedInt;
dynamic dynamicFloat = boxedFloat;

var intResult = new Transformations().TransformFrom(dynamicInt); // works
var floatResult = new Transformations().TransformFrom(dynamicFloat); // throws binder exception

当您编写
TransformFrom时(
,intellisense将向您显示重载。您不应该在
对象
中存储
十进制
字符串
。您可能会将
对象
变量
混淆。我澄清了这个问题,创建一个重载,接收对象并按类型重定向到正确的重载,如果没有,则返回null或空。但我认为它应该是日志类的一部分。Ofir也可以。对于不可转换的值,我会返回null。对于日志,我会返回空。你是对的。谢谢!谢谢!这个反射版本帮助了我:)是的,这很方便。HasOverloadForArgument也可以在其他地方使用,因此它是一个完美的库函数。