C# 检查对象类型,其中对象可能是int(32或64)

C# 检查对象类型,其中对象可能是int(32或64),c#,casting,types,C#,Casting,Types,我想用参数id分配属性MyProperty MyProperty属性的类型为Object,它可以是Int32或Int64 如何检查MyProperty字段的类型,然后根据基础类型将其id或id强制转换为int public void MyMethod(long id) { myClass.MyProperty = (typeof(MyProperty) == typeof(long)) ? id : (int)id; } 你可以做: if

我想用参数id分配属性MyProperty

MyProperty属性的类型为Object,它可以是Int32或Int64

如何检查MyProperty字段的类型,然后根据基础类型将其id或id强制转换为int

public void MyMethod(long id) {
    myClass.MyProperty
        = (typeof(MyProperty) == typeof(long))
        ? id
        : (int)id;
}
你可以做:

if(myClass.MyProperty is int){
.....  do int stuff
}
else
{
 ..... do long stuff.
}
您可以执行以下操作:

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

那么您想根据当前值的类型分配新值吗?如果是:

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 : (object) id;

那么您想根据当前值的类型分配新值吗?如果是:

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 : (object) id;

正如其他人所说,但我建议您使用Convert而不是casting:

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

正如其他人所说,但我建议您使用Convert而不是casting:

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

这个问题没有道理。 1.如果属性是一个对象,则可以根据需要指定任何内容。对象属性的类型为object。 2.如果要查看基础私有字段。。。您如何知道有一个底层字段可以开始?如果你知道有一个私有字段,为什么不知道它的类型呢

如果你处于非常奇怪的第二种情况,你可以做两件事。 a) 在属性中实现代码以执行检查和转换。 b) 使用包含底层字段元数据的属性装饰属性,并通过反射读取


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

< P>这个问题没有意义。 1.如果属性是一个对象,则可以根据需要指定任何内容。对象属性的类型为object。 2.如果要查看基础私有字段。。。您如何知道有一个底层字段可以开始?如果你知道有一个私有字段,为什么不知道它的类型呢

如果你处于非常奇怪的第二种情况,你可以做两件事。 a) 在属性中实现代码以执行检查和转换。 b) 使用包含底层字段元数据的属性装饰属性,并通过反射读取


总体上,你的问题表示设计问题,所以你最好考虑重新设计而不是黑客攻击。

使用它是否更容易/更清楚?代码>myClass.MyProperty=Convert.ChangeType(id,myClass.MyProperty.GetType())真。OP的要求有点奇怪——但似乎可以提炼为:“当为MyProperty赋值时,将值转换为与MyProperty相同的类型”——ChangeType调用很好地捕捉到了这一点。它避免了在多个地方对兼容类型进行尖锐的假设。。。如果MyProperty的赋值已经违反了预期的不变量,则可能会传播错误。使用Convert.ChangeType()进行此操作会更容易/更清晰吗<代码>myClass.MyProperty=Convert.ChangeType(id,myClass.MyProperty.GetType())真。OP的要求有点奇怪——但似乎可以提炼为:“当为MyProperty赋值时,将值转换为与MyProperty相同的类型”——ChangeType调用很好地捕捉到了这一点。它避免了在多个地方对兼容类型进行尖锐的假设。。。如果MyProperty的指定值已经违反了预期的不变量,则可能会传播错误。虽然我同意可能存在潜在的设计问题,但这个问题是有意义的-它正在尝试根据当前值指定具有特定类型的新值。感谢您的评论,也许我把我的问题简单化了;它最初是基于与LLBLGen实体的合作。虽然我同意可能存在一个潜在的设计问题,但这个问题是有意义的——它试图根据当前值为特定类型分配一个新值。感谢您的评论,也许我将我的问题简化了;它最初基于与LLBLGen实体的合作。