【问题标题】:Dynamically determine type to cast to (C#)动态确定要转换为的类型(C#)
【发布时间】:2012-07-06 22:10:43
【问题描述】:

我的函数接收对象类型的参数“值”。我想将它分配给一个对象的成员,但转换不会隐式发生,所以我需要明确指定它。但是,我不想在对象中实际指定该成员的当前类型,所以我可以这样做:

positiveOrder.OrderID = (int)value;

但是,如果业务需求发生变化并且 OrderID 以不同的方式生成和存储,例如 GUIDS 的字符串类型更改,我将不得不回到这里进行更改,这是不合需要的凝聚力。我已经尝试过各种代码排列,例如

positiveOrder.OrderID = value as thisOrder.OrderID.GetType();

positiveOrder.OrderID = (typeof(thisOrder.OrderID)) value;

但似乎没有任何效果。关于以编程方式指定要转换为的类型的任何想法?它可以在编译时或运行时完成,因为 Order 类不会改变。

【问题讨论】:

  • "如果明天我更改 Order 类以将其 OrderID 成员保存为 String",您为什么要这样做?以及这如何影响“价值”的类型(这也会改变)?
  • 值始终作为对象发送,通过我无法控制的代码。该代码不知道我的实现细节,这就是为什么它将它发送给我的原因。我可能必须根据不断变化的业务需求更改 OrderID 的类型。现在我在模型中使用简单的增量整数,但在最终的应用程序中,我可能会使用字符串来代替,例如。我不想通过两次指定 OrderID 的类型来重复自己,这样如果我必须更改它就不必更改它两次。这更像是一个很好的设计问题而不是功能问题。

标签: c# dynamic casting compile-time


【解决方案1】:

类似:

using System.Reflection;

receiver.GetType().GetProperty(propName).SetValue(receiver, value, null);

【讨论】:

  • 谢谢,一开始我不太明白你的代码在做什么,但它给了我很好的谷歌素材来解决这个问题:stackoverflow.com/questions/7616177/…,这似乎是我需要的,去现在就试试吧……
【解决方案2】:

如果positiveOrder.OrderID 始终是整数(即使以字符串表示),请不要将成员更改为整数以外的任何内容。相反,公开一些可以处理不同源类型的方法。

例如:

public void SetOrderID(object value)
{
    this.OrderID = Convert.ToInt32(value);
}

Convert.ToInt32()

【讨论】:

  • 感谢codesleuth,但正如您从我对问题的评论中看到的那样,这并不是我想要准备的变化。我只是希望这种转换与 OrderID 的底层类型无关,它可以根据需要更改为任何类型和种类(文本、数字、GUID)。但是,是的,如果实际 ID 保持不变,只是物理表示发生了变化,那么将它们转换回整数将是正确的方法。
  • 实际上这让我想到,你是对的,我可以在 Order 类中包含一个 setter 函数来进行强制转换。它仍然会两次提到 OrderID 的类型,但至少它会在同一个类中!我找到了应该在类型之间转换的方法,但由于某些奇怪的原因(Convert.ChangeType),它们仍然需要强制转换。我认为这个解决方案可能是对未损坏的东西实施修复的最小开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多