c#动态转换

本文关键字:转换 动态 | 更新日期: 2023-09-27 18:07:33

我知道这已经被问过几次了,但是我很难理解<T>的概念。

我正在做一个自定义GridView,我想在CellUpdate事件上设置Cell.Value属性。问题是,在大多数情况下,我将不得不从单元格的控制输入中获取字符串,而我不知道如何"动态"转换(以优雅的方式)这个String到原始对象,在这种情况下,在_Value中表示为对象。

希望这些对大家有所帮助,谢谢。

c#动态转换

Generic (<T>)和Dynamic是两个相反的概念。泛型应该在编译时已知,而动态则在运行时解析。因此,如果您仅在运行时动态地知道类型(<T>),则除非使用反射,否则无法调用泛型方法。

根据您的具体需求和您正在处理的代码,可能有不同的解决方案。

泛型和反射很难结合在一起,不建议使用。如果您想要同时使用这两种方法,那么从一开始它通常就是一个糟糕的设计。即使它不是一个糟糕的设计,也要考虑其他不需要你采取这种行动的方案。

我对泛型和反射有一些经验,我一点也不推荐使用。

我假设你的CellUpdate事件有一个等效的(对象发送者)?您应该能够将发送方强制转换为控件,并从该点使用属性。这是很难提供一个确切的例子,因为我不知道你的类型是如何设置的,但它可能是类似于((GridViewCell)sender)。可能有很多方法可以做到这一点但这很大程度上取决于你的具体实现

没有简单、自动的方法来做到这一点。使用convert . changetype()可以相对容易地在原语(即实现IConvertable的类型)之间进行转换。但除此之外,你就得靠自己了。

例如,这是一种粗糙但可能的方法:

object v = myCell.Value;
if(v is int)
{
    int vInt = (int)v;
    // ...
}
else if(v is string)
{
    string vStr = (string)v;
    // ...
}
else if(v is MyClass)
{
    MyClass vMyClass = (MyClass)v;
    // ...
}
// ...

请注意,在引用类型的情况下,最好使用as,然后检查null -我上面没有使用它,因为它会导致难看的代码,大量的局部变量,我宁愿避免这种情况,我宁愿付出性能损失。

你可以使用TypeConveters,要么是内置的系统类型,要么是你自己编写的自定义类型,例如:

 TypeConverter converter = TypeDescriptor.GetConverter(type);
 if (converter.CanConvertFrom(typeof(string)))...

看看我对另一个StackOverflow问题的回答