[C#] Object를 실제 유형으로 캐스팅하는 방법은 무엇입니까?

만약 내가 가지고 있다면:

void MyMethod(Object obj) {   ...   }

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


답변

JsonConvert.DeserializeObject (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();
}


답변

예를 들어 이제 유형이 abc라는 클래스에서 지향되는 경우 실제 유형으로 캐스팅하십시오. 다음과 같이 함수를 호출 할 수 있습니다.

(abc)(obj)).MyFunction();

기능을 모르는 경우 다른 방식으로 수행 할 수 있습니다. 항상 쉽지는 않습니다. 그러나 서명으로 어떤 식 으로든 찾을 수 있습니다. 이것이 귀하의 경우라면 저희에게 알려 주셔야합니다.