2014-10-16 1 views
1

MS SQL 데이터베이스의 데이터를 개체 목록으로 읽는 데 도움이되는 클래스가 있습니다. 대부분은 꽤 간단합니다. 클래스의 속성 이름을 테이블의 열 이름과 일치시키고 그에 따라 할당한다고 가정 할 수 있지만 때때로 데이터를 변환 할 수 있어야합니다.Func <> 매개 변수를 사용하여 사용자 지정 특성을 만드는 방법

내 클래스 속성에 넣어 사용자 지정 특성을 만들었습니다

[TransformData(TransformThisData = new Func<object, string, object>((v, p) => "My name is " + v.ToString()))] 
    public string Name { get; set; } 

오류를 :이 전 다음과 같이 즉석에서 Func을을 만들려는 말을하자, 이제

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public class TransformDataAttribute : Attribute 
{ 
    public Func<object, string, object> TransformThisData { get; set; } 
} 

을 유효한 속성 매개 변수 유형이 아니기 때문에 'TransformThisData'가 유효한 명명 된 속성 인수가 아닙니다.

속성 속성으로 Func을 수행하는 가장 좋은 방법은 무엇입니까?

+2

프리미티브의 프리미티브 또는 배열 만 특성 매개 변수로 사용할 수 있습니다. – DavidG

+0

클래스에서 표준 메서드를 사용하는 대신 함수로 특성을 지정해야하는 이유는 무엇입니까? – DavidG

+0

특정 속성의 데이터를 변환하는 특정 기능을 지정할 수 있기를 원했습니다. 예를 들어, 필자는 이상하게 혼합 된 데이터로 채워진 컬럼을 포함하는 데이터 테이블을 가지고있다. 문자열 (enum 값에 매핑 됨) 또는 숫자 (해당 숫자에 대한 열거 형의 문자열 값을 가져 오는 데 사용) 또는 열거 형 값에 매핑되는 키워드를 포함하는 문자열 열입니다. 데이터를 정리할 수 있기를 바랍니다.하지만이 방법으로 필요합니다. –

답변

2

글쎄, 내가 여기까지 올 수 있었다.

public class DataTransformation 
{ 
    public object FunkyData(object value, PropertyInfo pi) 
    { 
     // if data is this, return that, blah, blah 
     return value; 
    } 
} 

정적 께 :

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public class TransformDataAttribute : Attribute 
{ 
    public string TransformDataClass { get; set; } 
    // This method must contain these parameters: (object value, PropertyInfo pi) 
    public string TransformDataMethod { get; set; } 
} 

제가

public class Tracker 
    { 
    [TransformData(TransformDataClass = "CompanyTracker.DataTransformation", TransformDataMethod = "FunkyData")] 
    public string FunkyData { get; set; } 
    } 

난 변환의 다른 방법으로 하나의 데이터 변환 클래스를 가질 수 ...과 같이, 클래스 속성에 넣어 3 개의 파라미터를 해석하기위한 유틸리티 방법 :

public static object CallThisMethod(string className, string methodName, object[] parms) 
    { 
     Type type = Type.GetType(className); 
     MethodInfo theMethod = type.GetMethod(methodName); 
     object classInstance = Activator.CreateInstance(type); 

     return theMethod.Invoke(classInstance, parms); 
    } 
이 속성에 값을 할당에 관해서 내 ADO 도우미 코드에서

... 다음 :

 TransformDataAttribute attr = Utility.GetPropertyAttribute<TransformDataAttribute>(pi); 
     if (attr != null) 
     { 
      object[] parms = new object[] { value, pi }; 
      value = Utility.CallThisMethod(attr.TransformDataClass, attr.TransformDataMethod, parms); 
     } 
     pi.SetValue(t, value, null); 

그것은 작동합니다. 임베디드 문자열의 리플렉션을 클래스 및 메서드에 의존하는 것은 싫지만 좋은 디자인처럼 보이지는 않지만 때로는 작업을 완료해야합니다. 누구든지이 일을하는 더 우아한 방법이 있다면 그것에 대해 듣게되어 기쁩니다.

관련 문제