2009-05-07 2 views
6

배열에서 내 메서드의 들어오는 인수를 가져올 수 있습니다 궁금합니다. 아니면 그냥 내 인수의 값을 동적으로 검색하십시오.들어오는 인수 값을 KeyValuePair 배열에 캡처

의 의미, 같은 전화 : 나는 이것을 달성 할 수 있다면

{{"Test" => 10}, {"Test2", "eleven"}} 

더 나은 다음과 같습니다

void MyMethod(int Test, str Test2) {} 

같은 배열에 해결할 것인가 : 방법

MyMethod(10, "eleven"); 

반사와 함께. 예. 어떻게 든 StackTrace로.

+0

예. 너는 그들을 얻지 못할 것이다. 매개 변수 이름 만 가져옵니다. 그래서 나는 그것이 효과가 없을 것이라고 생각합니다. – Kirtan

+0

@Robin : 사전에 쉽게 인수를 추가하기 위해 제 구현을 보았습니까? 나는 내 대답을 편집했다. 이게 도움이 되었습니까? –

답변

2

가장 좋은 방법은 this example과 같이 익명 형식을 사용하는 것입니다.

3

당신이 찾고있는 것이 존재하지 않는다고 생각합니다. 당신이 할 수있는 가장 가까운 PARAMS입니다 :

MyMethod(params object[] args) 
{ 
    // if you have to do this, it's quite bad: 
    int intArg = (int)args[0]; 
    string stringArg = (string)arg[1]: 
} 

// call with any number (and type) of argument 
MyMethod(7, "tr"); 

아무 컴파일 타임 유형 검사가 없으며, 따라서 인수를 처리하는 모든 용도의 방법이 아닙니다. 그러나 인 경우 동적 인 경우입니다. 이는 아마도 해결책 일 것입니다.


편집 : 당신은 목록/사전에 수동으로 모든 인수를 둘 필요가

: 다른 생각을했다. 다음 있도록 헬퍼 클래스를 작성할 수 있습니다

MyMethod(int arg1, string arg2) 
{ 
    Arguments.Add(() => arg1); 
    Arguments.Add(() => arg2); 
    // 
} 

도우미는이

public static void Add<T>(Expression<Func<T>> expr) 
{ 
    // run the expression to get the argument value 
    object value = expr.Compile()(); 
    // get the argument name from the expression 
    string argumentName = ((MemberExpression)expr.Body).Member.Name; 

    // add it to some list: 
    argumentsDic.Add(argumentName, value); 
} 
+0

WebServices를 사용하고 있습니다. 나는 전화가 걸려 오는 인수를 포착하고 싶다 ... –

+0

나는 또 다른 생각을 가지고있다 ... 나의 대답의 새로운 부분을 보라. –

0

니스 질문 (+1)처럼 보인다. 나는 이것이 당신이 필요하다고 생각 -

MethodBase mb = MethodBase.GetCurrentMethod(); 
ParameterInfo[] pi = mb.GetParameters(); 
+0

하지만 인수 값을 얻지 못할 것입니다. 그렇지 않습니까? –

+1

나는 실제로 그것을 이미 시도했다. 하지만 인수의 이름 만 받고 들어오는/현재 호출의 값은 가져 오지 않습니다. –

+0

Stefan : 정확히 .. –

0

한 가지 방법은 내가 아는 (단지 방법 요즘 입니다 있는지 확실하지 않습니다, 그러나 그것은로 사용)에 aspect 지향 프로그래밍 (AOP)를 사용하는 것입니다, 그리고 특별한 차단. 손으로 굴리는 것은 약간 힘들지만 구조에 도움이되는 훌륭한 도구가 있습니다. 그러한 도구 중 하나는 PostSharp : http://www.postsharp.org/입니다.

0

이 메서드는 명명 된 매개 변수를 사용하기 때문에 이름과 값으로 사전을 명시 적으로 채울 수없는 이유는 무엇입니까? 이미 알고 있기 때문에 리플렉션을 사용하여 이름을 알 수있는 점은 거의 없습니다.

이미 말했듯이 params 키워드는 매개 변수의 개수가 가변적 인 메서드를 정의하는 데 사용할 수 있지만 정의에 따라 이름이 없습니다.

나는 당신이 무엇을 묻고 있는지, 당신이 그것을 설명해 준 방식으로는 어떤 의미가 있는지 잘 모르겠습니다. 아마도 당신은 더 자세히 설명 할 수 있을까요?

0

어쩌면 이것은 정확히 당신이 찾고자하는 것이 아니지만, 매트 해밀턴 (Matt Hamilton)의 제안에 익숙한 형식 매개 변수의 암시 적 이름 지정 방법을 사용하여 변형 된 상황에서 합리적인 타협점을 얻을 수 있음을 발견했습니다.

public void MyMethod(string arg1, bool arg2, int arg3, int arg4) 
{ 
    var dictionary = new PropertyDictionary(new 
    { 
     arg1, arg2, arg3, arg4 
    }); 
} 

public class PropertyDictionary : Dictionary<string, object> 
{ 
    public PropertyDictionary(object values) 
    { 
     if(values == null) 
      return; 

     foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(values)) 
      Add(property.Name, property.GetValue(values); 
    } 
}  

나는 매우 유용했다 (단위는 XML을 처리하는 방법을 테스트)가 현재 상황에서 유용 할 수 있지만, 광산하지 않을 수 말했듯이.

관련 문제