2012-01-26 2 views
2

의 인덱스와 동적 LINQ를 사용합니다. 데이터는 색인을 통해하우투는 내가 객체와의 ICollection은이 대신 속성 이름

public object this[int index] { 
    get{ .... } 
    set {....} 
} 

과 필터링 할 수있는 유전자 계급을 가지고 있습니다. properq과 linq 잘 작동합니다.

private static IQueryable CreateQueryable(IEnumerable<object> collection, Type itemType) 
{ 
     if (itemType == null) return null; 

     var queryableList = collection.AsQueryable(); 
     return queryableList.Provider.CreateQuery(
      Expression.Call(
       typeof(Queryable), "Cast", 
       new Type[] { itemType }, 
       queryableList.Expression)); 
} 

그래서 내가 좋아하는 필터 문자열을 사용할 수 있습니다 :

Queryable = CreateQueryable((IEnumerable<object>)mItemsSource.SourceCollection, ItemType); 
mQuery = Queryable.Where(filterString).Cast<object>(); 
ilteredCollection = mQuery.ToList(); 

에 : 나는 (단지 중요한 코드)를 사용 Id>10 또는 IdName은 속성 이름입니다 Name="abc" .

그러나 인덱스를 통해서만 액세스 할 수있는 다른 컬렉션에도 개체가 있습니다. 그래서 나는 같은 문자열을 가지고 :

[0]>10 or [1]="abc" 

나는 해결책을 찾지 못했습니다. idx이 요소 인덱스 및 Type입니다

new(it([idx] as Type) 

이 요소

예를 들면의 유형입니다 : 내가 찾을 수있는 유일한 힌트를 사용하는 것입니다

[0]>10 --> new(it[0] as object)>10 

하지만이 오류가보다 :

{"Operator '=' incompatible with operand types 'DynamicClass1' and 'Int32'"}

같이 내 필터 문자열을 Useing : 오류보다 더

new(it[0] as object)>"10" 

것은 : 그래서

{"Operator '=' incompatible with operand types 'DynamicClass1' and 'string'"}

- 이 문제를 어떻게 해결할 수 있습니까? 이것은 일반 Filter 클래스이므로 유형을 알지 못합니다. 그래서 성명으로 나는 단지 이런 물건을 사용할 수 있습니다.

누구든지 나를 도울 수 있기를 바랍니다. 아마도 동적 인 키워드는 C# 4.0에서 도움이 될 것입니까 ?? BTW 해결 방법은 각 클래스에 인덱서가있는 래퍼를 배치하는 것입니다. 그러나 이것은 많은 어리석은 작업이 될 것입니다. 그리고 그것은 실제 프로그래머가 싫어하는 것입니다.). 나는 해결책이 있다고 확신한다!

+0

[this] (http://stackoverflow.com/a/9044683/1107948)를 확인하고 업데이트를 읽어보십시오! – Johan

답변

0

new 키워드의 사용이 잘못되었습니다. 오브젝트를 캐스팅하지 않습니다 (as도 아닙니다).

키워드 new은 지정된 속성으로 익명 클래스의 새 개체를 만드는 데 사용됩니다. 따라서 new(it[idx] as Type)은 값이 it[idx]Type 속성으로 새 개체를 만듭니다. 이것은 C#의 new { Type = this[idx] }과 같습니다.

내가 이미 Dynamic linq: Is there a way to access object data by index?을 지적 했으므로 다음과 같은 방식으로 캐스팅해야합니다. Int32(it[0]) > 10 의사 쿼리 [0] > 10.

1

응원!

우선 - 현재 인스턴스에 액세스하는 방법?

이름없는 매개 변수 하나만 사용하여 람다 식을 구문 분석 할 때 이름없는 매개 변수의 멤버는 자동으로 식 문자열에 포함되며 이름없는 매개 변수에 의해 지정된 현재 인스턴스는 키워드 it을 사용하여 전체적으로 참조 될 수 있습니다. 예 :

고객 .Where ("Country = @ 0", country);

customers.Where ("it.Country = 0 @", 국가)에 동등하다; 왔다 개념 위에

위에서 설명으로부터

here. 설명, 지금 우리가 인덱서 속성을 액세스 할 수로 [@ 0] @ 0 후술하는 바와 같이 전달되는 인덱스 값이다.

//하는 클래스

아래 고려
public class Product 
{ 
    private NameValueCollection collection = new NameValueCollection(); 
    public string Company { get; set; } 
    public string Distributor { get; set; } 
    public int ID { get; set; } 
    ... 

    public string this[string index] 
    { 
     get { return collection[index]; } 
     set { if(!string.IsNullOrEmpty(value)) collection[index]=value; } 
    } 
} 

// 메인 코드

 List<Product> list = new List<Product>(); 
     Product product = new Product() { Company = "Nestle", Distributor = "xyz", ID = 1 }; 
     product["Name"] = "Maggi"; 
     list.Add(product); 
     var filteredList = list.AsQueryable().Where("it[@0][email protected]", "Name", "Maggi"); //Accessing the current item by indexer property 

     foreach (Product productItem in filteredList) 
     { 
      Console.WriteLine(productItem.Company); 
     } 

희망이 당신을 도와줍니다! :)