尝试调用调用的结果是“对象”与目标类型“不匹配”

本文关键字:不匹配 调用 目标 类型 对象 结果是 | 更新日期: 2023-09-27 18:08:04

我正在尝试对我在。net中定义的一系列枚举的使用做一些分解

    private static String GetSystemTranslatedField(Type enumtype, int? val) {
        if (val == null)
            return "";
        int value = (int)val;
        String tempstr;
        if (Enum.IsDefined(enumtype, value))
        {
            tempstr = (String) enumtype.GetMethod("ToString",Type.EmptyTypes).Invoke(val,null); 
            //equivalent to ((enumtype)val).ToString();
        }
    }

问题是,当试图运行这个,我得到臭名昭著的System.Reflection.TargetException: Object does not match target type.

作为一个额外的问题,是否有一种方法可以改变我的方法的签名,以便只接受从Enum派生的类型?这不是一个大问题,但我对类型限制很好奇,找不到任何东西

尝试调用调用的结果是“对象”与目标类型“不匹配”

您正在尝试调用ToString来自Int32上的枚举类型,这会导致反射API中的异常。

如果您想获得与值相关的标识符,请使用Enum.GetName,它也可以用于int(尽管文档似乎没有指出这一点):

if (Enum.IsDefined(enumtype, value))
{
    tempstr = Enum.GetName(enumType, value);
}

实际上,如果值没有定义,它将返回空字符串,因此也可以删除if(取决于其余代码中的内容):

tempstr = Enum.GetName(enumType, value);
c#不允许对Enum派生类型进行泛型约束。这在理论上是可行的(CLR不允许),但是它需要一些IL编织,Jon Skeet在他的Unconstrained Melody项目中展示了这一点。

Enum是一个类,因此您可以将其设置为方法签名的基础,并完全避免反射。试一试:

    private static String GetSystemTranslatedField(Enum enumtype, int? val) {
        if (!val.HasValue)
            return "";
        String tempstr;
        if (Enum.IsDefined(enumtype, val.Value))
        {
            tempstr = ((enumtype)val.Value).ToString(); 
        }
        ... // Rest of your code here
    }

注意,我清理了一下你的方法,主要是修饰的东西。