당신이 당신의 클래스 계층 구조를 게시 할 수 있습니까?
다음 코드는 가장 많이 파생 된 컴파일 타임 유형 확장 메서드가 선택되었음을 보여줍니다. 코드에 적용됩니까?
[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));
}
}
내가 방금 * 보여 * 짧지 만 완전한 예제를 작성하려고 할 수 확신 그 문제. 결국 DataTable을 만들고 AsEnumerable을 호출하면됩니다. 컴파일러에서 * exact * 오류 메시지를 게시 할 수 있다면 많은 도움이됩니다. –