[C#] 객체에 특정 방법 / 속성이 있는지 확인하는 방법?

아마도 동적 패턴을 사용합니까? 동적 키워드를 사용하여 모든 메소드 / 프로퍼티를 호출 할 수 있습니다. 예를 들어 myDynamicObject.DoStuff ()를 호출하기 전에 메소드가 존재하는지 확인하는 방법은 무엇입니까?



답변

당신은 그런 식으로 쓸 수 있습니다 :

public static bool HasMethod(this object objectToCheck, string methodName)
{
    var type = objectToCheck.GetType();
    return type.GetMethod(methodName) != null;
} 

편집 : 확장 방법을 사용하여 다음과 같이 사용할 수도 있습니다

myObject.HasMethod("SomeMethod");


답변

반사를 통해

 var property = object.GetType().GetProperty("YourProperty")
 property.SetValue(object,some_value,null);

메소드와 유사


답변

그것은 오래된 질문이지만 방금 뛰어 들었습니다.
Type.GetMethod(string name)해당 이름을 가진 메소드가 둘 이상인 경우 AmbiguousMatchException을 발생 시키므로 해당 경우를 처리하는 것이 좋습니다.

public static bool HasMethod(this object objectToCheck, string methodName)
{
    try
    {
        var type = objectToCheck.GetType();
        return type.GetMethod(methodName) != null;
    }
    catch(AmbiguousMatchException)
    {
        // ambiguous means there is more than one result,
        // which means: a method with that name does exist
        return true;
    }
} 


답변

이것을 위해 동적 유형을 사용하지 않고 클래스가 인터페이스를 구현하게하는 것이 좋지 않을 것입니다. 그런 다음 런타임에 객체가 해당 인터페이스를 구현하고 예상 된 메서드 (또는 속성)를 가지고 있는지 확인할 수 있습니다.

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}

이것이 유일한 방법이라고 생각합니다.

당신이 말하는 것은 오리 타이핑입니다. 이것은 객체에 메소드가 있음을 이미 알고 있지만 컴파일러가 확인할 수없는 시나리오에서 유용합니다. 예를 들어 COM interop 시나리오에서 유용합니다. ( 기사를 확인 하십시오)

예를 들어 오리 타이핑을 리플렉션과 결합하려면 오리 타이핑의 목표를 놓친 것 같습니다.


답변