尝试调用调用的结果是“对象”与目标类型“不匹配”
本文关键字:不匹配 调用 目标 类型 对象 结果是 | 更新日期: 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
}
注意,我清理了一下你的方法,主要是修饰的东西。