gpt4 book ai didi

c# - 使用 Reflection.SetValue 时如何提供转换?

转载 作者:行者123 更新时间:2023-11-30 12:13:57 24 4
gpt4 key购买 nike

我有一个伪装成 int 的类,所以它重载了各种运算符;

public class MyId
{
int value;
public virtual int Value
{
get { return this.value; }
set { this.value = value; }
}

public MyId(int value)
{
this.value = value;
}


public static implicit operator MyId(int rhs)
{
return new MyId(rhs);
}

public static implicit operator int(MyId rhs)
{
return rhs.Value;
}


}

但是,当我使用像

这样的代码时
PropertyInfo.SetValue(myObj, 13, null)
OR
MyId myId = 13;
int x = Convert.ToInt32(myId);
IConvertible iConvertible = x as IConvertible;
iConvertible.ToType(typeof(MyId), CultureInfo.CurrentCulture);

我的转换无效。我很困惑,这两个调用似乎都试图在 int 上调用 convert 这将失败,因为 int 不理解类型 MyId (即使所有赋值运算符都在那里)。任何解决方法的想法,我确定我一定错过了一些愚蠢的东西?

最佳答案

隐式转换是一种 C# 构造,不能通过反射获得。此外,通过反射设置字段或属性意味着您必须预先提供适当的类型。您可以尝试通过使用自定义 TypeConverter(或其他一些自定义转换方法)来避免这种情况,以帮助在使用反射之前在运行时转换您的类型。这是 TypeConverter 实现的粗略示例。

public class MyIdTypeConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture,
object value)
{
if (value is int)
return new MyId((int)value);
else if (value is MyId)
return value;
return base.ConvertFrom(context, culture, value);
}
}

这是我们尝试设置 Custom 属性的类型。

public class Container
{
[TypeConverter(typeof(MyIdTypeConverter))]
public MyId Custom { get; set; }
}

调用它的代码必须检查属性并提前执行转换,之后它可以调用 SetValue

var instance = new Container();
var type = typeof(Container);
var property = type.GetProperty("Custom");

var descriptor = TypeDescriptor.GetProperties(instance)["Custom"];
var converter = descriptor.Converter;
property.SetValue(instance, converter.ConvertFrom(15), null);

关于c# - 使用 Reflection.SetValue 时如何提供转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689083/

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