2010-07-07 109 views

回答

2

所以,你要分配基于当前值的类型的新的价值?如果是这样的:

if (myClass.MyProperty is int) 
{ 
    myClass.MyProperty = (int) id; 
} 
else 
{ 
    myClass.MyProperty = id; 
} 

可以与条件表达式做到这一点,但它是一个有点难看:

myClass.MyProperty = myClass.MyProperty is int 
    ? (object) id : (int) id; 

或者:

myClass.MyProperty = myClass.MyProperty is int 
    ? (object) (int) id : id; 

还是要想清楚,你真的,真的很想在这两种情况下拳击:

myClass.MyProperty = myClass.MyProperty is int 
    ? (object) (int) id : (object) id; 
+0

为此,使用Convert.ChangeType()会不会更容易/更清晰? 'myClass.MyProperty = Convert.ChangeType(id,myClass.MyProperty.GetType());' – LBushkin 2010-07-07 19:33:53

+0

@LBushkin:嗯......可能。没有一种方式感觉特别好,说实话... – 2010-07-07 19:38:00

+0

是的。 OP的要求有点奇怪 - 但似乎可以将它们提炼为:*“将值分配给MyProperty时,将该值转换为与MyProperty相同的类型” - - ChangeType调用捕获的很好。它避免了对多个地方的兼容类型的假设......如果分配的MyProperty值已经违反了预期的不变性,那么可能会传播错误。 – LBushkin 2010-07-07 20:09:39

2

你可以这样做:

if(myClass.MyProperty is int){ 
..... do int stuff 
} 
else 
{ 
..... do long stuff. 
} 

Is Operator.

1

正如有人说的,但我建议你使用转换,而不是铸造:

long l = 2147483648; // int.MaxValue + 1 
int i = (int)l; // i == -2147483648 oops 
i = Convert.ToInt32(l); // Overflow exception 
+1

或者只是在检查的上下文中操作,当然。 – 2010-07-07 19:44:40

0

这个问题没有意义。 1.如果属性是一个对象,您可以指定任何你想要的。对象属性的类型是对象。 2.如果你想看到潜在的私人领域......你怎么知道有一个潜在的领域开始?如果你知道有一个私人领域,你为什么不知道它的类型?

如果你处于非常奇怪的第二种情况,你可能会做2件事。 a)在属性中执行代码以进行检查和转换。 b)使用包含有关基础字段的元数据的属性来装饰属性,并通过反射来读取它。

总的来说,你的问题表明设计问题,所以你最好考虑重新设计,而不是黑客。

+0

虽然我同意这可能是一个潜在的设计问题,但问题*有意义 - 它试图根据当前值为特定类型分配新值。 – 2010-07-07 19:38:45

+0

感谢您的评论,也许我简化了我的问题;它基于最初与LLBLGen实体合作。 – 2010-07-07 19:39:07