我知道有几次被问过,但我很难理解<T>
这个概念。
我正在使用自定义GridView,我希望在Cell.Value
事件后设置CellUpdate
属性。问题是,在大多数情况下,我将不得不从单元格的控制输入中取一个字符串,而我不知道如何动态地&#39;将此String
(以优雅的方式)转换为原始对象,在本例中将_Value
表示为对象。
希望这一切都有意义,谢谢。
答案 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
的回答