2012-07-06 59 views
0

我的函数接收一个参数'值',类型对象。我想将它分配给一个对象的成员,但是这个转换不会隐式发生,所以我需要明确地指定它。不过,我不想竟指定当前类型的对象成员,所以我可以这样做:动态确定类型投到(C#)

positiveOrder.OrderID = (int)value; 

但是,如果业务需求的变化和OrderIDs生成并存储在不同的方式,包括一个类型改变为字符串为GUIDS例如,我将不得不回到这里并改变它,这是不希望的凝聚力。我已经与不同的代码排列尝试像

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

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

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

+2

“如果明天我更改Order类以将其OrderID成员保存为String,而不是”为什么要这样做?而这又如何影响'价值'的类型(这也可能会改变)? – Codesleuth 2012-07-06 12:44:49

+0

值总是作为对象发送,通过代码我不控制。该代码不知道我的实现细节,这就是为什么它发送它离开铸件给我。根据不断变化的业务需求,我可能必须更改OrderID的类型。现在,我在模型中使用了简单的增量整数,但在最终的应用程序中,我可能会使用字符串来代替。我只是不想通过指定两次OrderID的类型来重复自己,这样如果我必须更改它,我不需要更改它两次。这是一个比功能性问题更好的设计问题。 – Neil 2012-07-06 17:04:54

回答

2

如果positiveOrder.OrderID永远是(即使代表了一个字符串的整数),不更改成员是什么,但一个整数。相反,公开一些可以处理不同源类型的方法。

例如:

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

参见Convert.ToInt32()

+0

感谢codesleuth,但正如你将从我对这个问题的评论中看到的,这不是我想要为之做好准备。我只是希望这种转换能够不依赖于OrderID的底层类型,它可以根据需要更改为任何类型和类型(文本,数字,GUID)。但是,是的,如果实际ID保持不变,只是实际表示发生了变化,然后将它们转换为整数将是正确的选择。 – Neil 2012-07-06 17:09:03

+0

其实这让我想到了,你是对的,我可以在Order类中包含一个setter函数来执行投射。它仍然会提到两次OrderID的类型,但至少它会在同一个类中!我发现应该在类型之间进行转换的方法,但是仍然需要以某种奇怪的原因投射(Convert.ChangeType)。我认为这个解决方案可能是实现对未被破坏的东西的修复的最小开销。 – Neil 2012-07-06 17:26:56

0

喜欢的东西:

using System.Reflection; 

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

谢谢,我没有完全得到你的代码在开始时所做的,但它给了我很好的谷歌饲料达到这个问题:http://stackoverflow.com/questions/7616177/convert-to-a-type-在飞行中的网络,这似乎是我所需要的,现在试试吧... – Neil 2012-07-06 17:12:48