带有动态对象的RuntimeBinderException调用公共静态方法TryParse

时间:2019-07-31 23:27:22

标签: c#

我试图通过动态对象调用公共TryParse方法,但是我遇到了RuntimeBinderException ...“ System.Reflection.TypeInfo不包含TryParse的定义”。运行时动态对象的类型为System.Boolean,并且此类定义了该公共方法。

注意。这样做的原因是创建带有附加错误检查的通用TryParse方法,该方法将在应用程序中重复使用。

以下是重现该问题的代码:

    private (bool Success, T Value) TryParse<T>(string strval)
    {
        (bool Success, T Value) retval;
        dynamic dtype = typeof(T);
        retval.Success = dtype.TryParse(strval, out retval.Value);
        return retval;
    }

就我而言,我正在使用TryParse(“ true”)测试该方法。 我究竟做错了什么? 谢谢。

1 个答案:

答案 0 :(得分:0)

Bool.TryParse是静态方法。 Booltypeof(Bool)是不同的东西。 typeof(Bool)返回一个System.Reflection.TypeInfo(从System.Type继承)对象,该对象具有有关布尔类型的元数据,并且没有方法调用TryParse

可以使用反射从类型对象获取TryParse方法

Type tType = typeof(T);
object[] args = { "true", false };
MethodInfo tryParseMethodInfo = tType.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public);
bool result = (bool)tryParseMethodInfo.Invoke(null, args);

但是使用System.Convert可能会更好。您还可以查看使用here

中描述的方法