动态转换c#

动态转换c#,c#,types,C#,Types,我知道它已经被问了好几次,但我很难理解的概念 我正在处理一个自定义GridView,我想在CellUpdate事件上设置Cell.Value属性。问题是,在大多数情况下,我必须从单元格的控制输入中获取一个字符串,而我不知道如何(以优雅的方式)将该字符串动态转换为原始对象,在这种情况下,原始对象以\u值表示为对象 希望这些都有意义,谢谢。通用()和动态是两个相反的概念。泛型应该在编译时已知,动态的应该在运行时解析。因此,如果您仅在运行时动态地知道类型(),则除非使用反射,否则无法调用泛型方法 根据

我知道它已经被问了好几次,但我很难理解
的概念

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

希望这些都有意义,谢谢。

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


根据您处理的特定需求和代码,可能会有不同的解决方案。

没有简单、自动的方法。使用,您可以相对轻松地在原语(即实现的类型)之间进行转换。 但除此之外,你只能靠自己了

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

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;
    // ...
}
// ...

请注意,对于引用类型,最好使用
作为
,然后检查
null
——我没有在上面使用它,因为它会导致难看的代码,大量的局部变量,我更愿意避免这种情况,我宁愿支付性能惩罚。

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


我有一些泛型和反射方面的经验,我一点也不推荐。

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

您可以使用TypeConverters,内置的系统类型,或编写自己的自定义类型,例如:

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

看看我对另一个的回答

是否可以检索原始对象的
类型
(如int、float、CustomType等)你的意思是你不知道存储在单元格中的原始值的类型是什么?单元格.value的类型是onject,因此我可以运行cell.value.GetType()来获取我假设的类型。是的,我只知道运行时的类型。我能想到的唯一解决方案是运行数百个if(object.GetType().ToString()=“System.Int32”)@Esh,可能还有其他解决方案。