C# 如何将对象强制转换为其实际类型?
如果我有:C# 如何将对象强制转换为其实际类型?,c#,object,types,casting,typeof,C#,Object,Types,Casting,Typeof,如果我有: void MyMethod(Object obj) { ... } 如何将obj转换为实际类型?转换为实际类型很简单: void MyMethod(Object obj) { ActualType actualyType = (ActualType)obj; } 如果您知道实际类型,那么只需: SomeType typed = (SomeType)obj; typed.MyFunction(); 如果您不知道实际的类型,那么:不知道,不知道。您必须使用以下其中一
void MyMethod(Object obj) { ... }
如何将obj转换为实际类型?转换为实际类型很简单:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
如果您知道实际类型,那么只需:
SomeType typed = (SomeType)obj;
typed.MyFunction();
如果您不知道实际的类型,那么:不知道,不知道。您必须使用以下其中一种:
- 倒影
- 实现一个众所周知的接口
- 动态的
// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);
// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();
// dynamic
dynamic d = obj;
d.MyFunction();
我认为您不能(不能没有思考),您还应该为您的函数提供一个类型:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD:
这可能适用于您:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
如果您的MyFunction()
方法仅在一个类(及其子类)中定义,请尝试
如果有大量不相关的类定义了要调用的函数,则应定义一个接口,并让类定义该接口:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
将它转换为它的真实类型,如果您现在使用的是类型,例如,它是从名为abc的类定向的。 您可以通过以下方式调用函数:
(abc)(obj)).MyFunction();
如果你不知道它的功能,可以用另一种方式。总是不容易。但你可以通过签名找到它。如果这是您的情况,您应该让我们知道。在我的情况下,AutoMapper运行良好 AutoMapper无需任何显式配置即可映射到动态对象或从动态对象映射:
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;
Mapper.Initialize(cfg => {});
var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);
公共类Foo{
公共整型条{get;set;}
公共int Baz{get;set;}
}
动态foo=新的MyDynamicObject();
foo.Bar=5;
foo.Baz=6;
初始化(cfg=>{});
var result=Mapper.Map(foo);
结果:巴应相等(5);
结果:Baz应达到6级;
动态foo2=Mapper.Map(结果);
foo2.Bar.应等于(5);
foo2.Baz.ShouldEqual(6);
类似地,您可以直接从字典映射到对象,AutoMapper会将键与属性名对齐
更多信息如何
JsonConvert.DeserializeObject<SomeType>(object.ToString());
JsonConvert.DeserializeObject(object.ToString());
如果可以使用多个类型,则方法本身不知道要强制转换的类型,但调用方知道,您可以使用以下方法:
void TheObliviousHelperMethod<T>(object obj) {
(T)obj.ThatClassMethodYouWantedToInvoke();
}
// Meanwhile, where the method is called:
TheObliviousHelperMethod<ActualType>(obj);
void TheObliviousHelperMethod(objectobj){
(T) obj.您想要进入的类方法();
}
//同时,在调用方法的地方:
奥布利维奥瑟尔佩尔莫德(obj);
可以使用括号后的
where
关键字添加对类型的限制。编译时已知类型吗?您希望从中实现什么?请告诉我们您想要实现什么,而不是您期望如何实现它。@JonSkeet:我希望能够从对象调用函数。当前obj.MyFunction()
不编译,即使我知道真实对象确实有该函数。@PaulLassiter:如果你不知道类型,是什么声明了MyFunction
方法?如果你想在这个对象上调用一个方法,为什么不实现一个接口并在你的方法MyMethod(IMyinterface obj)中调用它?这是不合逻辑的。你实际上不知道真正的类型。你应该怎么做?Swift中的等效语法是什么?Nevermind,为类型转换找到as
,并使用type(of:ClassName)
函数检查实例类型。object类型的对象的反射不会产生对象的“实际类型”,正如OP所要求的那样,您的MyMethod逻辑有缺陷,因为obj可以是类型A,也可以是类型B。您的逻辑不提供“实际类型”(根据OP的请求)——它提供了兼容的类型,而不一定是当时所需的类型。请使用obj.GetType()。这肯定会返回它的实际类型。我们已经知道“类型”。他希望将其解析为“T”@user12637955这实际上是一个有效的答案,但由于装箱和拆箱(即object->ToString()->到具体类型),因此具有更大的复杂性。更准确地说,它应该是这样的:var myType=JsonConvert.DeserializeObject(object.ToString())代码>
JsonConvert.DeserializeObject<SomeType>(object.ToString());
void TheObliviousHelperMethod<T>(object obj) {
(T)obj.ThatClassMethodYouWantedToInvoke();
}
// Meanwhile, where the method is called:
TheObliviousHelperMethod<ActualType>(obj);