2012-06-14 5 views
6

이 질문은 어딘가에 대답되었을 것이라고 확신하지만, 키워드 찾기에 적절한 키워드 조합을 찾는 데 큰 어려움을 겪고 있습니다.동적 메서드 실행

dynamic someObj = new SomeObject(); 

var methodName = "someMethodName"; 

// execute methodName on someObj 

나는 기본적으로 메소드 이름을 저장하는 변수를 사용하여 동적 객체의 메소드를 실행하기 위해 가능하면 알고 싶어이 같은 일을하기 위해 가능하면

내가 알고 궁금합니다.

+0

'object'는'System.Object' 클래스의 C# 별명입니다. 'obj'라고 이름을 바꾸어야합니다. – dasblinkenlight

+0

왜 그렇게 했습니까? 그 이름을 가진 메소드를 찾으려면 바닐라 리플렉션을 사용해야합니다. 당신이 그렇게하려고한다면 동적을 사용하지 마십시오. –

+4

아니요, 여기에 동적 요소가 필요합니다. SignalR을 사용하고 있으며 현재 클라이언트 연결을 나타내는 동적 객체를 노출합니다. 이 객체에서 앞쪽에있는 JavaScript 끝점에 매핑되는 임의의 메서드를 호출 할 수 있습니다. 내가 명시 적으로 내 코드와 제 3 자 코드 사이의 추상화 수준을 추가하는 허브 아키텍처와 상호 작용하지 않기 위해 기본 클래스에이 논리를 캡슐화하려고합니다 – devshorts

답변

7

임의의 개체에서 수행 할 수 있습니다. reflection을 사용하는 개체는 반드시 dynamic 일 필요는 없습니다. 당신이 dynamic를 사용하는 경우

object obj = new SomeObject(); 
var meth = obj.GetType().GetMethod("someMethodName"); 
meth.Invoke(obj, new object[0]); // assuming a no-arg method 

, 당신은 방법 이름 어떤 식별자를 사용할 수 있으며, 컴파일러는 불평하지 않습니다

dynamic obj = MakeSomeObject(); 
obj.someMethodName(); // Compiler takes it fine, even if MakeSomeObject returns an object that does not declare someMethodName() 
+1

+1, GetType()이 동적 객체에서 작동하지만 솔루션에서 그런 식으로 나열하지 않았다는 사실에 놀라움 – Milimetric

+1

@Milimetric : "동적 객체"와 같은 것은 없습니다. 'dynamic' 변수는 일반 객체를 유지합니다. 이것은 IDynamicMetaObject와 함께 작동하지 않습니다. – SLaks

+0

'var' 또는'DansAwesomeClass'로 타입이 지정된 객체와 달리'dynamic'으로 타입 된 객체를 의미했습니다. – Milimetric

2

글쎄, 실제로 "someMethodName"따옴표가 필요하지 않습니다. 당신은이 (전체 프로그램 목록)을 수행하는 경우에 당신의 방법 이름은 자바 스크립트 또는 뭔가 같은 몇 가지 악한 곳에서 오는

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic obj = new SomeObject(); 
     obj.someMethodName("hello"); 
    } 
} 

public class SomeObject 
{ 
    public void someMethodName(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

, 당신은이 작업을 수행 할 수 있습니다

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic obj = new SomeObject(); 
     var meth = obj.GetType().GetMethod("someMethodName"); 
     meth.Invoke(obj, new object[1]{"hello"}); 
    } 
} 

public class SomeObject 
{ 
    public void someMethodName(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 
+0

고마워, 질문은 JavaScript에서 온다. 나는이 문제 자체를 제시하는 방법 인 SignalR 메카닉을 캡슐화하려고 노력하고있다. – devshorts

+1

멋지다 : 놀라운 점은 동적 객체에서 GetType()을 호출 할 수 있다는 것이다. 하지만이 경우에는 평범한 오래된 일반 System.Object를 사용하고 있기 때문에 받아 들인 대답이 더 낫다고 생각합니다. 가벼운 것이 아닌 동적 인 것에 반대하십시오. 오, 그리고 동적 디버깅하기가 더 어렵습니다. 저는 Visual Studio를 몇 번 충돌시키면서 Watch에 역학 관계를 추가했습니다. – Milimetric

1

를 귀하의 의견을 바탕으로, 요구 사항은 문자열을 사용하여 SignalR 동적 클라이언트 프록시의 기능을 호출 할 수 있어야합니다. 이를 수행하기 위해 리플렉션을 사용하려고 시도합니다 (예 : .GetType().GetMethod(functionName)). 동적 객체가 아니기 때문에 작동하지 않습니다.

그러나 동적 개체의 Invoke 메서드를 사용하여 수행 할 수 있습니다.

var functionName = "alertAllUsers"; 
var message = "Hello!"; 
var groupID = "1"; 

var connection = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 
connection.Clients.Group(groupID).Invoke(functionName, message);