如何将对象转换为其类型?

Uma*_*med 6 c#

如何将对象(Object类型)转换为实际类型?

我需要做这样的事情

Myobject [i] += Myobject [j];
Run Code Online (Sandbox Code Playgroud)

Myobject的类型是Object.Myobject [i]和myobject [j]将始终属于同一类型.

Myobject [i] .Gettype()会给我类型...但是我如何将对象实际转换为该类型以执行'+'运算符

Nol*_*rin 16

我假设+为您的自定义类型定义了addition()运算符(MyType在此示例中).

如果是这样,您只需要转换分配的LHS和RHS.这是必需的,因为两个操作数在编译时必须是已知类型才能选择正确的运算符重载.这是静态语言所需要的,尽管动态语言(可能是C#4.0)可以解决这个问题.

((MyType)Myobject[i]) += (MyType)Myobject[j];
Run Code Online (Sandbox Code Playgroud)

更新:

一些反射魔法可以在C#2.0/3.0中解决这个问题(缺乏动态类型).

public static object Add(object a, object b)
{
    var type = a.GetType();
    if (type != b.GetType())
        throw new ArgumentException("Operands are not of the same type.");

    var op = type.GetMethod("op_Addition", BindingFlags.Static | BindingFlags.Public);
    return op.Invoke(null, new object[] { a, b });
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于非基本类型.对于原始类型(如int,float等),您需要在手动转换操作数的类型上添加switch语句并应用加法运算符.这是因为操作符重载实际上并不是为原始类型定义的,而是内置于CLR中.

无论如何,希望能解决你的问题.


Mar*_*ell 8

类型是在编译时知道的吗?

除了已知的固定类型之外,C#不支持运算符(直到C#4.0).

您可以通过一些技巧使用泛型运算符- 就像这样.让我知道泛型是否是一个因素(我可以详细谈论......)

在4.0中,您可以使用:

dynamic x = MyObject[i];
x += MyObject[j];
MyObject[i] = x;
Run Code Online (Sandbox Code Playgroud)

使用dynamic会导致很多魔法发生;-p

除了这两个场景之外,您需要在编译时知道它们的类型,或者做很多工作.

  • 哦,它可以*完成* - 它只是一项大量的工作.尤其是,"int"和"float"实际上没有运算符(它们在IL级别处理) - 但"十进制"确实如此.添加"提升"运算符(Nullable <T>)等的复杂性.你可以做的最好的事情就是测试已知的有限选项集 - float/int/double/decimal等.但是做一个"任何"类型"操作是痛苦的. (2认同)