繁体   English   中英

如何将对象转换为原始类型?

[英]How can I cast an object to the original type?

我有一个可以返回许多类型的对象的方法(这就是为什么它返回类型为object的实例的原因)。

如何将其转换为原始类型? (问题是关于在运行时我不知道其类型时是否强制转换为其原始类型。这与我知道其类型时是否强制转换有关;这就是为什么GetAnyObject方法为黑盒)

private void func()
{
    var obj = GetAnyObject();
    callFunc(obj);
}
private void callFunc(object o)
{
    var a = o.GetType();
    ...
}

您可以继续使用as ,因为如果转换失败,它将返回null。

private void callFunc(object o)
{
    var test = a as MyClass;
    if (test != null)
    {
       // your logic
    }
}

如果您有需要转换的类列表,请在上述函数的主体中对其进行测试。

如果可能的类型有共同点,则可能要创建一个所有这些类型都实现的接口,并将结果转换为该接口类型。

private void func()
{
    var obj = (IMyInterface)GetAnyObject();
    callFunc(obj);
}

private void callFunc(IMyInterface o)
{
    ...
}

在您的评论之一中,您说该对象是一个数组。 也许IEnumerable就足够了吗?

编辑

您声明自己正在使用不会更改的第三方代码。 因此,您获得的所有对象都必须具有一些共同点,以使您的代码至少具有一定的通用性。 否则,您将在不同的情况下遇到很多if 我想到的一件事是通过反射检索并调用MemberInfo对象。 假定所有类型都定义了该成员。 我在谈论类似于以下内容的内容:

MethodInfo someMethod = obj.GetType().GetMethod("M");
object result = someMethod.Invoke(obj);

在不知道困境的确切细节的情况下,很难提出一个好的解决方案;-)

将对象强制转换为类型只有在编译时才有意义。 您会对代码中的转换对象有何反应?

该对象已经具有 “原始”类型。 情况是,当您将其威胁为object ,在编译时就不知道其类型。 当然,在运行时,它将作为您调用的“原始”类型。

假设您有一个重写ToString()方法的类:

public class Foo 
{
    public override string ToString() { return "I am foo"; }
}

然后,您有一段代码:

Foo foo = new Foo();
object obj = foo;
// obj is of course Foo type
Console.Write(obj.ToString());

当然,这将导致向控制台写入“ I am foo”,因为变量obj的类型为Foo ,并且它将正常运行。

然后假设我们有一个类:

public class Bar 
{
    public override string ToString() { return "I am bar"; }

    public void Foobar() {}
}

以及您希望拥有的一段不真实的代码:

object obj = new Bar();

// your runtime type casting here:
var casted = (obj.GetType()) obj;

问题是:您将如何使用casted变量? 您可以调用方法Foobar()吗? 当您不知道类型时,如何知道是否可以在编译时调用方法Foobar()

也许您寻求的是多态性? 也许反思? 也许是动态物体?

编辑:从您所说的,您需要一个反思,一种在运行时调查类型的机制。 看到这个:

var type = obj.GetType();
var props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach(var prop in props)
{
    Console.WriteLine("property: {0} type:{1}", prop.Name, prop.PropertyType);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM