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


155

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


myDynamicObject 의 유형은 무엇입니까 ? 그것은 파생 클래스 DynamicObject입니까?
Cheng Chen

동적 키워드로 선언 된 것
Louis Rhys

답변:


224

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

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

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

myObject.HasMethod("SomeMethod");

GetType ()은 런타임 유형을 반환합니까? (즉, 반대하지 않습니까?)
Louis Rhys

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

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

또한 확장 방법은 정적이어야합니다.
Fraser

9
작성하는 것을 선호합니다 : objectToCheck.GetType (). GetMethod (methodName)! = null
efirat

85

반사를 통해

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

메소드와 유사


좋은. 적절한 정의 된 속성을 얻기 위해 루프에서 GetMethod를 수행 할 수도 있습니다.
Jnr

연결된 UI 컨트롤 및 해당 부모 목록을 반복하는 데 유용
Chicowitz

GetType()같은 방법이 GetProperties()있습니다. 의 배열을 반환 PropertyInfo합니다. 그러나 어떻게 방법을 사용할 수 GetProperties()있습니까?
Yogesh Patel

43

그것은 오래된 질문이지만 방금 뛰어 들었습니다. 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;
    }
} 

18

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

public interface IMyInterface
{
   void Somemethod();
}


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

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

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

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


2
개체가 .NET 프레임 워크에서 제공하는 개체 일 수 있으며 구현을 선언 할 수없는 경우 어떻게해야합니까?
루이스리스

뭐가 문제 야 ? '객체'가 같은 방식으로 .NET 프레임 워크에서 제공하는 그러한 객체인지 확인할 수 있습니다
Frederik Gheysels

예를 들어, 개체에 "추가"방법이 있는지 확인하려고합니다. 개체는 List <int>이거나 IEnumerable이 아닌 다른 클래스 일 수 있습니다.
Louis Rhys

3
COM을 사용하여 Adobe 제품을 스크립팅하는 것을 살펴볼 수 있습니다. 동일한 함수 호출은 완전히 다른 COM 객체를 반환 할 수 있으며 (Adobe의) 설계에 따르면 유일한 공통 조상은 객체입니다. 또한 이것은 거의 모든 현대적인 동적 스크립팅 언어 (Python, Javascript, VB 스크립트, PHP, Lua 등)의 일반적인 패턴입니다. 버그가 아니라 기능입니다.
Tim Keating 님이

5
그것은 냄새이지만 Microsoft에 의해 만들어졌습니다. Button, LinkButton 등과 같은 WebControl을보십시오. 둘 다 OnClientClick 속성을 구현하지만 ListControl 및 Panel은 그렇지 않습니다. OnClientClick은 인터페이스에 정의되어 있지 않으므로 리플렉션이 유일한 옵션입니다.
HammerIp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.