2011-02-25 8 views
120

동적 패턴을 사용하고 있습니까? 동적 키워드를 사용하여 모든 메소드/속성을 호출 할 수 있습니다. 맞습니까? myDynamicObject.DoStuff()를 호출하기 전에 메서드가 존재하는지 확인하는 방법 (예 :?)개체에 특정 메서드/속성이 있는지 확인하는 방법은 무엇입니까?

+0

* myDynamicObject *의 유형은 무엇인가를 처리? 그것은'DynamicObject'에서 파생 된 클래스입니까? –

+0

동적 키워드 –

답변

180

방법입니다 :

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

편집 : 당신도 확장 방법을이

처럼 사용할 수 있습니다
myObject.HasMethod("SomeMethod"); 
+0

GetType()이 런타임 유형을 반환합니까? (즉, 객체가 아닙니까?) –

+2

예, GetType()은 실행중인 유형을 반환하는 반면 typeof()는 객체를 반환합니다. – Julien

+1

문서에 따르면 GetType()은 "현재 인스턴스의 정확한 런타임 유형"을 반환합니다. – tzup

14

동적 유형을 사용하지 않는 것이 좋으며 클래스가 인터페이스를 구현하도록하지 않는 것이 좋습니다. 그런 다음 런타임에 객체가 해당 인터페이스를 구현하는지 확인할 수 있으므로 예상되는 메소드 (또는 속성)가 있습니다.

public interface IMyInterface 
{ 
    void Somemethod(); 
} 


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

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

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

예를 들어 오리와 타이핑을 결합하려는 경우 오리 입력의 목표를 놓치고 있다고 생각합니다.

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

유사 반사를 통해

+2

으로 선언 된 항목 개체가 .NET Framework에서 제공하는 개체가 될 수 있다면 무엇이든지 구현하도록 선언 할 수 없습니까? –

+0

무엇이 문제입니까? .NET Framework에서 제공하는 '개체'가 이러한 개체인지 확인하려면 –

+0

과 같은 방법으로 개체에 "추가"메서드가 있는지 확인해야합니다. 그리고 개체가 List 이거나 IEnumerable이 아닌 다른 클래스가 될 수 있습니다. –

64

당신은 그런 일을 쓸 수

+0

니스. 루프에서 GetMethod를 수행하여 적절한 정의 된 특성을 얻을 수도 있습니다. – Jnr

32

그것은 오래된 질문이지만 방금 만났습니다. 그 이름을 가진 하나 개 이상의 방법이 있다면 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; 
    } 
} 
관련 문제