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



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

如何将其转换为原始类型?(问题是关于转换到它的原始类型,当我不知道它在运行时的类型。当我知道它的类型时,它不是关于铸造的;这就是为什么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",因为变量objFoo类型的,并且它会正常工作。

假设我们有一个类:

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()方法的类型时,你怎么知道你是否可以在编译时调用它呢?

也许你寻找的是多态性?也许反映?也许是动态对象?

EDIT:从你所说的,你需要一个反射,一个在运行时调查类型的机制。看到这个:

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);
}

相关内容

  • 没有找到相关文章

最新更新