2009-07-01 5 views
3

한 유형의 객체에서 다른 유형의 객체로 매핑하는 함수를 작성하고 있습니다. Map 메서드의 매개 변수로 전달되는 객체에는 객체에서 적절한 값을 찾을 수있는 문자열 인덱서가 있어야합니다 (또는 아니라). mapper가 사전, DataRow, DataReader 등을 얻는 지에 대해서는 정말로 신경 쓰지 않습니다.C# : 메서드 매개 변수에 인덱서 필요

메서드에 전달 된 매개 변수가 문자열 인덱서를 구현해야하는지 여부를 지정할 방법이 있습니까? 나는 그와 같은 것을 찾을 수 없다.

리플렉션을 사용하여 유형을 사용할 수없는 경우 사용할 수있는 유형으로 캐스팅합니다. 그러나이를 처리 할 수있는 적절한 방법이 있는지 궁금합니다.

답변

5

당신은이 같은 인터페이스를 만들 수 있습니다

interface IFoo 
{ 
    String this[Int32 index] { get; set; } 
} 

문자열 인덱서를 구현해야합니다이 인터페이스를 구현하고 메소드의 매개 변수의 유형 인 경우 IFoo 당신이 것을 알 수있는 모든 종류의 인덱서가 있습니다.

6

아니요, 그렇게 할 수 없습니다. Andrew 's와 같은 인터페이스를 사용하거나 인덱스 값을 검색하는 Func<T, string>을 전달할 수 있습니다.

public void ConsumeIndexedFunction<T>(Func<string, T> something) 
{ 
    var foo = something("bar"); 
    // do something with foo 
} 

public void TestMethod(
    Dictionary<string, object> myDictionary, 
    DataTable myDataTable, 
    IDataReader myDataReader) 
{ 
    ConsumeIndexedFunction(x => myDictionary[x]); 
    ConsumeIndexedFunction(x => myDataTable.Rows[0][x]); 
    ConsumeIndexedFunction(x => myDataReader[x]); 
} 

(예에. 덕분에이 아이디어를 구체화 마이클 메도우에게 감사!)

+0

정말 좋은 아이디어를 구현해야! –

+1

Func 처럼! – Vivek

+0

감사합니다. DataRow/Dictionary와 같은 미리 정의 된 클래스에 인터페이스를 추가 할 수 없기 때문에 인터페이스가 수정되지 않습니다. 나는 입력 된 아이디어가 아마 이것을 해결하는 가장 좋은 방법이라고 생각합니다! – Jasper

0

당신이 인터페이스를 구현하는 매퍼에 전달하고자 (각각 또는 클래스) 모든 개체를 만들 수 있습니다하지 않는 한 이러한 인덱서를 정의하면 리플렉션을 사용해야합니다.

0

는 인터페이스는이 경우 도움이되지 않을까요 :

interface IImplementMe { 
    string this[int index] 
    { 
     get; 
     set; 
    } 
} 

는 그냥 매개 변수는 인터페이스

관련 문제