[英]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.