문제

연관 배열을 메소드로 전달하는 방법을 찾고 있습니다. C#에서 ActionScript Tween 패키지를 다시 작성하려고하지만 "연관"배열/객체로 문제가 발생합니다. 일반적으로 ActionScript에서는 다음과 같은 작업을 수행 할 수 있습니다.

public function tween(obj:DisplayObject, params:Object = null):void {
    if (params.ease != null) {
        //do something
    }
    //...
}

그리고 이것은 다음과 같이 호출 될 수 있습니다.

tween(this, {ease:'out', duration:15});

C#에서 똑같이 할 수있는 방법을 찾고 있습니다. 지금까지 나는 다음과 같은 옵션을 수집했습니다.

a) 가능한 매개 변수 키와 유형을 정의하기 위해 클래스 또는 struct를 만들고

b) 매개 변수를 일반 유형으로 전달하십시오

tween(frameworkElement, new {ease = 'out', duration = 15});

가정합니다

public static void tween(FrameworkElement target, object parameters);

트윈 기능에서이를 사용하는 방법을 알아냅니다 (키 = 값을 분리하는 방법을 잘 모르겠습니다. 그 개체가 주어집니다. 아이디어가 있습니까?)

c) a Dictionary<string, object> 매개 변수를 트윈 함수로 전달합니다

다른 아이디어 나 샘플 코드가 있습니까? 나는 C#을 처음 접했다.

편집하다

하루 종일 이것을 알아 내기 위해 나를 데려 갔다.

"익명 유형은 어셈블리 경계에서 공유 할 수 없습니다. 컴파일러는 각 어셈블리 내에 주어진 속성 이름/유형 쌍의 시퀀스에 대해 최대 하나의 익명 유형이 있는지 확인합니다. 어셈블리간에 구조를 전달하려면이를 적절히 정의해야합니다."

도움이 되었습니까?

해결책

편집하다: 이것은 기본적으로 htmlhelper 확장자가 ASP.NET MVC에서 사용하는 메커니즘입니다. 나와 함께 독창적이지 않습니다.


나는 두 개의 다른 서명이있는 하이브리드 접근법을 선호합니다. 참고 : 나는 이것을 시도하지 않았으며 두 서명 사이에 충돌이있을 수 있으므로 두 번째 방법에 컴파일러가 선택할 수 있도록 약간 다른 이름을 부여해야 할 수도 있지만 그렇게 생각하지 않습니다.

public static void tween( FrameworkElement target, object parameters )
{
    return tween( target, new ParameterDictionary( parameters ) );
}

public static void tween( FrameworkElement target,
                          ParameterDictionary values )
{
    if (values.ContainsKey( "ease" ))
    {
      ....
    }
}

그런 다음 익명 유형의 반사를 사용하고 사전을 설정하는 ParameterDictionary 클래스가 있습니다.

public class ParameterDictionary : Dictionary<string,object>
{
    public ParameterDictionary( object parameters )
    {
         if (parameters != null)
         {
             foreach (PropertyInfo info in parameters.GetType()
                                                     .GetProperties())
             {
                 object value = info.GetValue(parameters,null);
                 this.Add(info.Name,value);
             }
         }
    }
}

이것은 당신에게 사용 편의성과 소비의 용이성을 제공합니다. "못생긴"반사 재료는 방법보다는 사전의 단일 생성자에 랩핑됩니다. 물론, 사전은 반사 코드가 한 번만 작성된 반사 코드와 비슷한 목적으로 반복해서 사용할 수 있습니다.

다른 팁

사전은 합리적인 접근법입니다. 다음과 같이 보일 수 있습니다.

public static void tween(FrameworkElement target, IDictionary<string, object> parameters)
{
    if (parameters.ContainsKey("ease")) {
        //do something
    }
}

값을 전달할 때 단축 수집 초기화 구문을 사용하여 다음과 같이 더 쉽게 만들 수 있습니다.

tween(something, new Dictionary<string, object> { { "ease", "out" }, { duration, 15 } });

이것은 ActionScript 코드와 대략 "동일한 일"을하는 매우 빠른 방법이지만 실제로는 C#이 아닙니다. C#-ish 방법은 가능한 각 매개 변수에 대한 속성을 갖춘 실제 트윈 파라미터 구조 또는 클래스를 만들고 하나를 작성하여 트윈 ()으로 전달하는 것입니다. 이것은 트윈 ()의 내부를 보지 않고 발신자에게 분명하기 때문에 일반적으로 더 관리 가능한 것으로 간주됩니다. "지속 시간" "Duratoin"오타.

나는 옵션 (b) 자신의 팬입니다 - 익명 유형을 전달하고 반사를 사용하여 값을 파싱합니다.

나는 다른 사람들이 Lambda 표현을 사용하여 같은 것을 달성하는 것을 보았습니다. 호출 구문은 다음과 같습니다.

tween(frameworkElement, ease => "out", duration => 15);

그리고 선언은 다음의 선을 따라 무언가가 될 것입니다.

public static void tween(FrameworkElement target, params Expression<Func<object>>[] parameters) { ... }

아이디어는 변수 수의 "개체를 반환하는 함수"를 취할 수 있다는 것입니다. 그런 다음 각각의 매개 변수 이름을 구문 분석합니다. 표현u003CTDelegate>, 그리고 각 사람을 호출하여 가치를 얻으십시오.

나는 이것이 익명 유형을 반영하는 것보다 낫지 않다고 생각하지만, 또 다른 접근법입니다.

업데이트

나는 실제로 내 블로그의 사전으로 연관 배열을 전달한다는 아이디어에 대해 글을 썼습니다. 여기 그리고 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top