만약 내가 가지고 있다면:
void MyMethod(Object obj) { ... }
obj
실제 유형이 무엇인지 어떻게 캐스트 할 수 있습니까?
obj.MyFunction();
실제 개체에 해당 기능이 있음을 알고 있지만 현재 는 컴파일되지 않습니다.
MyFunction
메서드를 선언하는 것은 무엇 입니까?
만약 내가 가지고 있다면:
void MyMethod(Object obj) { ... }
obj
실제 유형이 무엇인지 어떻게 캐스트 할 수 있습니까?
obj.MyFunction();
실제 개체에 해당 기능이 있음을 알고 있지만 현재 는 컴파일되지 않습니다.
MyFunction
메서드를 선언하는 것은 무엇 입니까?
답변:
실제 유형을 알고 있다면 다음을 수행하십시오.
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();
as
캐스팅 및 type(of: ClassName)
인스턴스 유형을 확인하는 기능이 있습니다.
나는 당신이 할 수 있다고 생각하지 않는다.
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;
...
}
}
JsonConvert.DeserializeObject (object.ToString ());
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
제 경우에는 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);
마찬가지로 사전에서 객체로 직접 매핑 할 수 있으며 AutoMapper는 속성 이름과 함께 키를 정렬합니다.
더 많은 정보 https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
이 방법은 가장 효율적이지는 않지만 간단하고 작업을 수행합니다.
두 가지 작업을 수행합니다. 먼저 기본적으로 직렬화 인 .ToString ()을 호출 한 다음 Newtonsoft 너겟 ( 설치해야 함) 을 사용한 역 직렬화를 호출 합니다 .
public T Format<T>(Object obj) =>
JsonConvert.DeserializeObject<T>(obj.ToString());
귀하의 경우 MyFunction()
방법은 하나 개의 클래스 (와 그 하위) 만 정의, 시도
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
호출하려는 함수를 정의하는 관련없는 클래스에 많은 수가있는 경우 인터페이스를 정의하고 클래스가 해당 인터페이스를 정의하도록해야합니다.
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
실제 유형으로 변환하는 것은 쉽습니다.
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}