动态转换c#

时间:2011-09-04 07:49:47

标签: c# types

我知道有几次被问过,但我很难理解<T>这个概念。

我正在使用自定义GridView,我希望在Cell.Value事件后设置CellUpdate属性。问题是,在大多数情况下,我将不得不从单元格的控制输入中取一个字符串,而我不知道如何动态地&#39;将此String(以优雅的方式)转换为原始对象,在本例中将_Value表示为对象。

希望这一切都有意义,谢谢。

5 个答案:

答案 0 :(得分:3)

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

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

答案 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 - 我之前没有使用它,因为它会导致丑陋的代码,很多局部变量,而且我更愿意避免这种情况,而我宁愿支付性能损失。

答案 2 :(得分:0)

泛型和反射非常困难,不建议使用。如果你想要同时使用它们,那么通常是一个糟糕的设计。即使这不是一个糟糕的设计,也可以考虑不需要你采取这种行动的替代方案。

我对泛型和反射有一些经验,我不推荐它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用TypeConveters(系统类型的内置类型),也可以为自定义类型编写自己的类型,例如:

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

看看我对另一个StackOverflow question

的回答