gpt4 book ai didi

c# - 强制类型 setter 接受兼容类型

转载 作者:太空宇宙 更新时间:2023-11-03 19:43:26 25 4
gpt4 key购买 nike

假设有一个类

public class MyClass { public decimal Id { get; set; } }

我需要使用 Id 属性的 setter 方法将小数、整数、字节等动态分配给 Id,如下所示:

var setterMethod = typeof(MyClass).GetMethods(...)...First();
setterMethod.Invoke(myClassInstance, (int)1);

但由于类型不匹配(int 与 decimal),这不起作用。

同时这很好用:

decimal decZero = 0;
int intZero = 0;
byte byteZero = 0;
var sample1 = new MyClass{ Id = decZero };
var sample2 = new MyClass{ Id = intZero };
var sample3 = new MyClass{ Id = byteZero };

C# 可以隐式转换数字类型是什么意思。

如何使用类型 setter 将整数、小数、字节等动态分配给 Id 属性?

最佳答案

(重写答案以处理数字类型之间的转换,以及它们的可为空和/或可枚举的变体)

为了处理内置数字类型之间的转换,Convert.ChangeType(object,Type)方法将是你的 friend 。只需确保该值实现 IConvertible 接口(interface)(像 int 或 double 这样的原始 .NET 类型通常会这样做)。

在可枚举类型和数字类型之间进行转换时,Enum.ToObject(Type,object)应该改用。给定的值应与可枚举的基础类型相匹配,因此要将小数转换为基于整数的 int,需要进行额外的转换。

如果需要字符串解析,那么Enum.Parse(Type,string)将是处理可枚举值所必需的。对于普通数字类型,只要您不尝试从小数点格式的字符串解析整数类型,Convert.ChangeType 就足够了。

最后,Convert.ChangeType 不适用于可空类型,因此需要先提取基础类型。 Nullable.GetUnderlyingType(Type)就是为了这个。

将它们放在一起,我们可以构建一个扩展的 ChangeType 方法:

public static object ExtendedChangeType(object value, Type targetType)
{
if (value == null)
return null;

targetType = Nullable.GetUnderlyingType(targetType) ?? targetType;
if (targetType.IsEnum)
{
if (value is string)
{
return Enum.Parse(targetType, value as string);
}
else
{
value = Convert.ChangeType(value, Enum.GetUnderlyingType(targetType));
return Enum.ToObject(targetType, value);
}
}
else
{
return Convert.ChangeType(value, targetType);
}
}

然后我们可以这样使用它:

PropertyInfo property = typeof(MyClass).GetProperty(nameof(MyClass.Id));
var value = ExtendedChangeType((int)1, valueType);
property.SetValue(myClassInstance, value);

关于c# - 强制类型 setter 接受兼容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49582614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com