动态转换 c#

3

我知道这个问题已经被提出了好几次,但我很难理解 <T> 这个概念。

我正在开发一个自定义的 GridView,并希望在 CellUpdate 事件中设置 Cell.Value 属性。问题是,在大多数情况下,我需要从单元格的控件输入中取得一个字符串,但我不知道如何以优雅的方式“动态”将此String 转换回原始对象,该对象在本例中表示为 _Value

希望这些内容中有任何一点有意义,谢谢。


能否获取原始对象的“类型”(如int,float,CustomType等)? - Devendra D. Chavan
你的意思是说你不知道单元格中存储的原始值的类型? - Zenwalker
Cell.Value 是一个对象类型,因此我可以运行 Cell.Value.GetType() 来获取我所假定的类型。 - Slime recipe
5个回答

3

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

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


是的,我只能在运行时知道类型。我能想到的唯一解决方案就是运行数百个if(object.GetType().ToString() == "System.Int32")。 - Slime recipe
@Esh,可能还有其他解决方案。 - Darin Dimitrov

1

泛型和反射在一起使用非常困难,不建议使用。如果你必须同时使用它们,通常说明设计本身就有问题。即使没有问题,请考虑其他不需要采取这种行动的替代方案。

我有一些泛型和反射的经验,我不推荐这样做。


0

没有简单、自动的方法来完成它。你可以相对容易地在原始类型之间进行转换(即实现了IConvertable接口的类型),使用Convert.ChangeType()。 但除此之外,你就只能靠自己了。

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

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 - 我之前没有使用它是因为它会导致丑陋的代码、大量的本地变量,我更喜欢避免这种情况,而宁愿承担性能损失。

0

您可以使用TypeConveters,包括系统类型的内置转换器或为自定义类型编写的转换器,例如:

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

看一下我對另一個StackOverflow問題的回答吧


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接