我知道这个问题已经被提出了好几次,但我很难理解 <T>
这个概念。
我正在开发一个自定义的 GridView,并希望在 CellUpdate
事件中设置 Cell.Value
属性。问题是,在大多数情况下,我需要从单元格的控件输入中取得一个字符串,但我不知道如何以优雅的方式“动态”将此String
转换回原始对象,该对象在本例中表示为 _Value
。
希望这些内容中有任何一点有意义,谢谢。
我知道这个问题已经被提出了好几次,但我很难理解 <T>
这个概念。
我正在开发一个自定义的 GridView,并希望在 CellUpdate
事件中设置 Cell.Value
属性。问题是,在大多数情况下,我需要从单元格的控件输入中取得一个字符串,但我不知道如何以优雅的方式“动态”将此String
转换回原始对象,该对象在本例中表示为 _Value
。
希望这些内容中有任何一点有意义,谢谢。
泛型(<T>
)和动态是两个相反的概念。泛型应该在编译时已知,而动态则在运行时解析。因此,如果您只在运行时动态地知道类型(<T>
),除非使用反射,否则无法调用泛型方法。
根据您的具体要求和处理的代码,可能会有不同的解决方案。
泛型和反射在一起使用非常困难,不建议使用。如果你必须同时使用它们,通常说明设计本身就有问题。即使没有问题,请考虑其他不需要采取这种行动的替代方案。
我有一些泛型和反射的经验,我不推荐这样做。
没有简单、自动的方法来完成它。你可以相对容易地在原始类型之间进行转换(即实现了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
- 我之前没有使用它是因为它会导致丑陋的代码、大量的本地变量,我更喜欢避免这种情况,而宁愿承担性能损失。您可以使用TypeConveters,包括系统类型的内置转换器或为自定义类型编写的转换器,例如:
TypeConverter converter = TypeDescriptor.GetConverter(type);
if (converter.CanConvertFrom(typeof(string)))...
看一下我對另一個StackOverflow問題的回答吧