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


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.