2013-05-08 3 views
1

일부 ASP.NET MVC 3을 수행하고 있고 열거 형 작업을위한 몇 가지 확장 메서드를 설정하고 있습니다. 그 중 하나는 [Description] 특성을 찾는 화려한 ToString()이고 다른 하나는 Html.DropDownList()에서 사용하기 위해 열거 형에서 SelectList를 작성합니다. 이 두 메소드는 모두 동일한 정적 클래스에 있습니다.다른 일반 확장 메서드의 매개 변수에 대한 일반 확장 메서드 호출

public static SelectList ToSelectList<TEnum>(this TEnum? enumval) where TEnum : struct { 
    var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.GetDescription() }; 
    SelectList list = new SelectList(values, "ID", "Name", enumval); 
    return list; 
} 

public static string GetDescription<TEnum>(this TEnum? enumval) where TEnum : struct { 
    //Some reflection that fetches the [Description] attribute, or returns enumval.ToString() if it isn't defined. 
} 

그러나 컴파일러는 그 진술에 대한 Name = e.GetDescription()을 울음 소리 ...

'TEnum은' '으로 getDescription'없이 확장 방법에 대한 정의를 포함하지 않는 '으로 getDescription'형식의 첫 번째 인수를 받아들이는 'TEnum'을 찾을 수 있습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?)

이것은 놀라운 일이 아니지만 GetDescription을 인식하는 컴파일러를 얻는 방법을 모르겠습니다.)를 유효한 전자로 ToSelectList()의 enumval 매개 변수에 대한 xtension 메소드입니다. GetDescription()의 내장을 개인 정적 메서드로 옮기고 확장 메서드를 래퍼로 만들면이 작업을 수행 할 수 있음을 알았지 만 일반적인 확장 메서드를 연결하는 것은 제대로 수행하는 방법을 알고 있어야하는 것처럼 보입니다.

+0

변수 e는 유형 TEnum입니다. GetDescription 확장 메서드는 Nullable 이고 TEnum은 아닙니다. GetDescription을 TEnum (Nullable이 아님)의 확장으로 만들 수 있습니까? ? –

답변

2

e은 nullable 구조체가 아닙니다. 그것은 단지 구조체입니다. GetDescription은 nullable 구조체를 사용합니다.

을 nullable로 만들거나 nullableable 버전을 GetDescription으로 지정하십시오.

+0

그래, 나 마약이야. 나는 TEnum e에서 TEnum으로 변경했다. 그게 날 잡았어. 감사. – db2

+0

@ db2 : 완료 한 경우 응답 –

+1

@ChamikaSandamal을 받아들입니다. 그래서 마킹하기 전에 10 분 정도 기다렸습니다. – db2

0

Nullable<TEnum>을 매개 변수로 사용하는 특별한 이유가 있습니까? 왜 널 값으로이 확장 메소드 중 하나를 호출하려고하는지 생각하는 데 어려움을 겪고 있습니다. 당신이 널 (NULL) 요구 사항을 제거하면

것은, 당신은 그들이 아닌 일반적이고 친근 (당신은 일반적인 방법으로 열거 값으로 확장 메서드 구문을 사용시키는 포함)입니다 직접 Enum 유형에 따라 만들 수 있습니다

를 그런 다음
public static SelectList ToSelectList(this Enum enumval) 
{ 
    var values = from Enum e in Enum.GetValues(enumval.GetType()) select new { ID = e, Name = e.GetDescription() }; 
    SelectList list = new SelectList(values, "ID", "Name", enumval); 
    return list; 
} 

public static string GetDescription(this Enum enumval) 
{ 
    //Some reflection that fetches the [Description] attribute, or returns enumval.ToString() if it isn't defined. 
} 

당신은 할 수 있습니다 : 당신이 현재 일반 버전과 함께 할 수 있다고 생각하지 않습니다

MyEnum enumval = MyEnum.Whatever; 
var list = enumval.ToSelectList(); 

... - 당신이 그것을 호출해야 할 것 :

을3210
MyEnum enumval = MyEnum.Whatever; 
var list = ((MyEnum?)enumval).ToSelectList(); 
+0

사실이 경우 nullable enum을 사용하고 있습니다. 열거 형은 프로젝트 작업 항목 상태 (필요, 필요 없음, 해결됨 ...)를 나타내며 null 값은 "아직 설정되지 않음"을 나타냅니다. 그러나 나는 이것이 코드를 정리하는 방법을 좋아합니다. 열거 형에 "Not Set"값을 추가하고이 방법으로 처리하는 것을 고려해 보겠습니다. 나는 지금 인터페이스 프로토 타이핑 일 뿐이므로 변경하기에 이르다. – db2

+0

Gotcha. 언젠가 언젠가 열거 형의 nullableable 버전으로 작업하고있는 경우에 대비하여 가능한 한 일반적인 일을하고 싶습니다. 확장 메소드의 두 버전을 모두 가질 수는 없습니다. –