2009-12-29 3 views
1

우리 응용 프로그램에서 이상한 동작이 있습니다. 테이블의 행을 반복하고 싶습니다 (DataTable). DataTableExtensions 클래스의 AsEnumerable() 확장 방법을 사용하고 싶습니다. 비슷한 것 :사용자 지정 확장 메서드가 프레임 워크 확장 메서드와 충돌합니다. 왜?

foreach(var thing in table.AsEnumerable()) 
{ 
... 
} 

컴파일 할 때 일부 ESRI DLL (GIS 응용 프로그램)을 참조해야한다고 불평합니다. 일부 파고 후, 나는 ESRI에서 유형의 일부를 확장 참조 된 DLL에서 몇 확장 메서드 (예 : IEnumField, IEnumLayer 등)

분명히

하는 DataTable 그이 무엇처럼 아무것도 내가 할 수없는 발견 AsEnumerable(this DataTable) 대신 AsEnumerable(this IEnumLayer)에 바인딩하려고하는 이유를 찾은 것 같습니다. 재미있는 점은 우리가 Resharper (멋진 도구!)를 사용하고 있으며 Resharper가 우리 편이라는 것입니다. 정의로 이동하면 객체 브라우저에서 AsEnumerable(this DataTable)으로 이동합니다.

독점 코드의 수천 줄을 게시하지 않고 여기에 많은 코드 샘플을 게시 할 수 없으므로 을 찾고 있습니다. 한 번만 같은 문제가 있었는데 그 이유는 ... 답변 유형입니다.

명백한 해결책은 해당 네임 스페이스에 대한 모든 using 문을 제거하여 확장 메서드에 대한 참조를 제거하는 것입니다. 그러나 이것은 타입 선언을 완전하게 한정하도록 우리를 강요하는 부작용을 가지고 있습니다. 예쁘지 않은.

미리 알려 주셔서 감사합니다.

에릭.

+0

내가 방금 * 보여 * 짧지 만 완전한 예제를 작성하려고 할 수 확신 그 문제. 결국 DataTable을 만들고 AsEnumerable을 호출하면됩니다. 컴파일러에서 * exact * 오류 메시지를 게시 할 수 있다면 많은 도움이됩니다. –

답변

0

using [alias = ]class_or_namespace;의 별칭 = 부분을 사용할 수 있습니다. 그럼 당신은 using my = System.Data; 같은 것을 가질 것이고, 그 시도 my.DataTable.AsEnumerable();

+0

Yuriy, 확장 방법과 함께 "사용"하는 방법을 보여주는 빠른 스 니펫을 게시 할 수 있습니까? table.AsEnumerable() 구문을 유지하려고했습니다.나는 우리 문맥에서 명확하지 않은 AsEnumerable (표)로 전환하라는 제안을하고 있다고 생각합니다. 감사합니다. –

0
foreach(var thing in ((DataTable)table).AsEnumerable()) 
{ 
... 
} 

와 함께 사용 ....

+0

감사합니다. 이미 시도했지만 다른 AsEnumerable()을 선택했습니다. –

0

을 나는 당신이이 문제를 타격하는 이유 정말 모르겠지만, 하나의 잠재적 인 해결 방법은 것 확장 방법 문법 설탕을 포기하고 그냥 보통의 정적 방법으로 AsEnumerable을 치료하는 :

foreach (var thing in DataTableExtensions.AsEnumerable(table)) 
{ 
    // do something 
} 
0

당신이 당신의 클래스 계층 구조를 게시 할 수 있습니까?

다음 코드는 가장 많이 파생 된 컴파일 타임 유형 확장 메서드가 선택되었음을 보여줍니다. 코드에 적용됩니까?

[TestMethod] 
    public void Test1() 
    { 
     IEnumerable<MyCustomClass> myCustomList = new MyCustomList() 
         { 
          new MyCustomClass() { Int1 = 1}, 
          new MyCustomClass() { Int1 = 2}, 
          new MyCustomClass() { Int1 = 3}, 
         }; 

     //Ignores MyCustomList method and uses IEnumerable<> method. 
     Assert.AreEqual(2, myCustomList.Where(x => x.Int1 > 1).Count()); 
    } 

    [TestMethod] 
    public void Test2() 
    { 
     MyCustomList myCustomList = new MyCustomList() 
         { 
          new MyCustomClass() { Int1 = 1}, 
          new MyCustomClass() { Int1 = 2}, 
          new MyCustomClass() { Int1 = 3}, 
         }; 

     //Uses MyCustomList method 
     Assert.AreEqual(1, myCustomList.Where(x => x.Int1 > 1).Count()); 
    } 

    [TestMethod] 
    public void Test3() 
    { 
     ISomeInterface myCustomList = new MyCustomList() 
         { 
          new MyCustomClass() { Int1 = 1}, 
          new MyCustomClass() { Int1 = 2}, 
          new MyCustomClass() { Int1 = 3}, 
         }; 

     //If your type is ISomeInterface, the compiler uses ISomeInterface method, even if the runtime instance is MyCustomList 
     Assert.AreEqual(0, myCustomList.Where(x => x.Int1 > 1).Count()); 
    } 

    [TestMethod] 
    public void Test4() 
    { 
     MyDerivedCustomList myCustomList = new MyDerivedCustomList() 
         { 
          new MyCustomClass() { Int1 = 1}, 
          new MyCustomClass() { Int1 = 2}, 
          new MyCustomClass() { Int1 = 3}, 
         }; 

     //Even if MyDerivedCustomList implements ISomeInterface, the compiler uses MyCustomList method 
     Assert.AreEqual(1, myCustomList.Where(x => x.Int1 > 1).Count()); 
    } 

    [TestMethod] 
    public void Test5() 
    { 
     ISomeInterface myCustomList = new MyDerivedCustomList() 
         { 
          new MyCustomClass() { Int1 = 1}, 
          new MyCustomClass() { Int1 = 2}, 
          new MyCustomClass() { Int1 = 3}, 
         }; 

     //If your type is ISomeInterface, the compiler uses ISomeInterface method, even if the runtime instance is MyDerivedCustomList 
     Assert.AreEqual(0, myCustomList.Where(x => x.Int1 > 1).Count()); 
    } 

사용이 클래스 :

public class MyCustomClass 
{ 
    public int Int1 { get; set; } 
} 

public class MyCustomList : List<MyCustomClass>, ISomeInterface 
{ 
    public MyCustomList() : base() { } 
    public MyCustomList(IEnumerable<MyCustomClass> coll) : base(coll) { } 
} 

public interface ISomeInterface : IEnumerable<MyCustomClass> 
{ 
} 

public class MyDerivedCustomList : MyCustomList, ISomeInterface 
{ 
    public MyDerivedCustomList() : base() { } 
    public MyDerivedCustomList(IEnumerable<MyCustomClass> coll) : base(coll) { } 
} 

public static class MyExtensions 
{ 
    /// <summary> 
    /// Where(x => x.Int1 > 2) 
    /// </summary> 
    public static IEnumerable<MyCustomClass> Where(this MyCustomList myList, Func<MyCustomClass, bool> predicate) 
    { 
     return new MyCustomList(Enumerable.Where(myList, predicate).Where(x => x.Int1 > 2)); 
    } 

    /// <summary> 
    /// Where(x => x.Int1 > 3) 
    /// </summary> 
    public static IEnumerable<MyCustomClass> Where(this ISomeInterface myList, Func<MyCustomClass, bool> predicate) 
    { 
     return new MyCustomList(Enumerable.Where(myList, predicate).Where(x => x.Int1 > 3)); 
    } 
} 
0

아마도 최선을 작동합니다 다음

foreach (DataRow dr in table.Rows) 
{ 
} 
관련 문제