2016-08-25 1 views
1

동적 유형에 대한 확장 메소드를 작성하려고하지만 일부 또는 다른 이유로 코드 컴파일 중에 오류가 발생합니다. 아래에있는 내 코드 샘플은 내가 사용하고있는 방법은동적 유형에 MVC 확장 메소드를 만드는 방법

public List<State> getStates() 
{ 

    return new List<State>(){ 
     new State{StateID="1",StateName="Tamil Nadu"}, 
     new State{StateID="2",StateName="Assam"}, 
     new State{StateID="3",StateName="Andra"}, 
     new State{StateID="4",StateName="bihar"}, 
     new State{StateID="5",StateName="Bengal"},    
    }; 
} 

하고 내 확장 방법은 내가이 얻을

public static class helper 
{ 
    public static IEnumerable<SelectListItem> getIntoDropDownState(this List<dynamic> data,string textField,string valueField) 
    { 
     return data.Select(x => new SelectListItem 
     { 
      Text = x.textField, 
      Value = x.valueField 
     }); 
    } 
} 

내 컴파일 오류가

컴파일러 오류 메시지 : CS1928 : 'System.Collections.Generic.List' 에 'getIntoDropDownState'에 대한 정의가없고 확장명이 일치 함 HOD 과부하 'LearnAuthentication.Controllers.helper.getIntoDropDownState (System.Collections.Generic.List, 문자열, 문자열)'일부 잘못된 인수

나는이 같은 확장 방법을 사용하려면이 있고, 내가 직면하고있다 사람이 확장 방법에

+0

의 무거운 반사 리프팅을 수행 System.Web.Mvc.SelectList을 사용할 수 있습니다 . 어떤 오류가 발생하고 있습니까? –

+0

@ stephen.vakil 안녕하세요, 오류를 업데이트했습니다.보세요. 감사합니다 –

+1

@ LijinJohn, 그 확장 방법은 당신이 묘사하는 것을하지 않을 것입니다. 당신은 반사 및 제네릭을 사용할 수 있습니다 – Nkosi

답변

1

해당 확장 방법은 귀하가 설명하는 것을 수행하지 않습니다. 반사와 제네릭을 사용할 수 있습니다. 여기

public static class helper { 
    public static IEnumerable<SelectListItem> getIntoDropDownState<T>(this List<T> data, string textField, string valueField) where T : class { 
     var type = typeof(T); 

     var textPropertyInfo = type.GetProperty(textField); 
     var valuePropertyInfo = type.GetProperty(valueField); 

     return data.Select(x => new SelectListItem { 
      Text = (string)textPropertyInfo.GetValue(x), 
      Value = (string)valuePropertyInfo.GetValue(x) 
     }); 
    } 
} 

은 확장 메서드에 대한 단위 테스트입니다

[TestClass] 
public class MyTestClass { 
    [TestMethod] 
    public void MyTestMethod() { 
     //Arrange 
     var data = getStates(); 

     //Act 
     var result = data.getIntoDropDownState("StateName", "StateID"); 

     //Assert 
     Assert.IsNotNull(result); 
     var first = result.First(); 
     Assert.AreEqual(data[0].StateName, first.Text); 
     Assert.AreEqual(data[0].StateID, first.Value); 
    } 

    public List<State> getStates() { 

     return new List<State>(){ 
      new State{StateID="1",StateName="Tamil Nadu"}, 
      new State{StateID="2",StateName="Assam"}, 
      new State{StateID="3",StateName="Andra"}, 
      new State{StateID="4",StateName="bihar"}, 
      new State{StateID="5",StateName="Bengal"},    
     }; 
    } 

    public class State { 
     public string StateID { get; set; } 
     public string StateName { get; set; } 
    } 
} 

아니면 반사를 포기하고이 코드는 나를 위해 컴파일하면

public static class helper { 
    public static IEnumerable<System.Web.Mvc.SelectListItem> getIntoDropDownState<T>(this List<T> data, string textField, string valueField) where T : class { 

     return new System.Web.Mvc.SelectList(data, valueField, textField); 

    } 
} 
+0

이것이 가능한 유일한 방법이라고 생각합니다. 시간 내 주셔서 감사합니다. 나는 실제로 MVC에서 바인딩을 쉽게 얻을 수있는 드롭 다운을 호출하여 메소드를 만들고 싶었다. –

1

동적 유형을 도울 수있는 오류

@Html.DropDownListFor(x => x.StateID, new LearnAuthentication.Controllers.Address().getStates().getIntoDropDownState("StateName", "StateID"), "Select State", 0) 

은 지원되지 않습니다. 동적 유형을 실제 유형으로 변환하면 효과가 있습니다. 자세한 내용은 아래 URL을 확인하십시오. Extension methods cannot be dynamically dispatched

+0

나는 내 코드를 업데이트 해 주셔서 감사합니다. –

관련 문제