我有一个方法,它可以返回多种类型的对象(这就是为什么它返回一个对象类型的实例)。
如何将其转换为原始类型?(问题是关于转换到它的原始类型,当我不知道它在运行时的类型。当我知道它的类型时,它不是关于铸造的;这就是为什么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()
方法的类型时,你怎么知道你是否可以在编译时调用它呢?
也许你寻找的是多态性?也许反映?也许是动态对象?
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);
}