【问题标题】:Dynamic conversion c#动态转换 c#
【发布时间】:2011-09-04 16:14:48
【问题描述】:

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

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

希望这一切都有意义,谢谢。

【问题讨论】:

  • 能否取回原对象的Type(如int、float、CustomType等)
  • 你的意思是你不知道存储在单元格中的原始值的类型是什么?
  • Cell.Value 是 onject 类型,因此我可以运行 Cell.Value.GetType() 来获取我假设的类型。

标签: c# types


【解决方案1】:

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

根据您正在处理的具体要求和代码,可能会有不同的解决方案。

【讨论】:

  • 是的,我只会在运行时知道类型。我能想到的唯一解决方案是运行数百个 if(object.GetType().ToString() == "System.Int32")
  • @Esh,可能还有其他解决方案。
【解决方案2】:

泛型和反射很难在一起,不建议使用。如果您想同时使用两者,那么一开始通常是一个糟糕的设计。即使它不是一个糟糕的设计,也要考虑不需要您采取这种行动的替代方案。

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

【讨论】:

    【解决方案3】:

    我假设您的 CellUpdate 事件相当于 (Object sender) ? 您应该能够将发件人转换为您的控件并使用该点的属性。 很难提供一个确切的例子,因为我不知道你的类型是如何设置的,但它可能类似于 ((GridViewCell)sender).Text; 可能有很多方法可以做到这一点,但这在很大程度上取决于您的具体实现。

    【讨论】:

      【解决方案4】:

      没有简单、自动的方法来做到这一点。您可以使用Convert.ChangeType() 在基元(即实现IConvertable 的类型)之间相对轻松地进行转换。 但除此之外,您只能靠自己了。

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

      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 - 我没有在上面使用它,因为它会导致丑陋的代码,很多局部变量,我更喜欢避免这种情况,我宁愿支付性能损失。

      【讨论】:

        【解决方案5】:

        您可以使用 TypeConveters,既可以是系统类型的内置,也可以为自定义类型编写自己的,例如:

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

        看看我对另一个StackOverflow question的回答

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 2020-10-06
          相关资源
          最近更新 更多