【问题标题】:Convert value from string to generic type that is either Guid or int将值从字符串转换为 Guid 或 int 的泛型类型
【发布时间】:2011-10-27 11:14:33
【问题描述】:

我有一个通用方法,它可以将 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

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

【问题讨论】:

    标签: c# asp.net generics casting


    【解决方案1】:

    下面的代码可以很好地转换为 Guid 。检查一下

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

    【讨论】:

      【解决方案2】:

      如果T 将是GuidInt32,那么它真的 不是很通用,是吗?只需编写两个方法 - 使用不同的名称,或 可能 重载。我看不出在这里使用泛型有什么好处,而且它很可能会让你的代码变得比它需要的更复杂。

      【讨论】:

      • 你说得对,但这是一个人为的例子,该方法还有更多功能,它确实在我正在做的更广泛的背景下简化了事情。
      • @Veli:这就是为什么在写问题时要小心,并给出有代表性的图片。我仍然会考虑将其拆分为两个公共的非泛型方法,它们可能使用一个通用的泛型私有方法作为实现的部分
      【解决方案3】:

      也许你可以试试这样的:

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

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 1970-01-01
        • 2021-10-25
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        相关资源
        最近更新 更多