将值从字符串转换为Guid或int的泛型类型

时间:2011-10-27 11:14:34

标签: c# asp.net generics casting

我有一个泛型方法,它将字符串中的id(例如,从ASP.NET表单上的HiddenField的值中检索)转换为目标类型,并使用它执行某些操作。

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
    T id = (T)Convert.ChangeType(rawId, typeof(T));
    doSomethingWithId(id);
}

T将是Guid或Int32,并且当它是Guid时,上面的代码会在(运行时)结束,说从String到Guid的转换是无效的。

然后我想我可能会尝试检查类型,如果Guid,实例化一个新的Guid:

var id = default(T);
if (id is Guid)
    id = new Guid(rawId);
else
    id = (T)Convert.ChangeType(rawId, typeof(T));

现在这给出了一个错误(在编译时),Guid无法转换为类型T

不太确定如何解决这个问题。有什么建议吗?

3 个答案:

答案 0 :(得分:23)

以下代码可以正常转换为Guid。检查

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);

答案 1 :(得分:4)

如果TGuidInt32,则 非常通用,是吗?只需编写两种方法 - 使用不同的名称,或者可能重载。我没有看到在这里使用泛型的好处,它可能会使你的代码更加复杂。

答案 2 :(得分:1)

你可以尝试这样的事情:

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId });
    doSomethingWithId(id);
}