2011-08-12 5 views
3

나는 다음과 같은 기능이 있습니다패스 동적 데이터 유형은 작동하려면

private string ParseJson(dynamic q) 
    { 
     string returnJSON = "[{ \"type\" : \"pie\", \"name\" : \"Campaigns\", \"data\" : [ "; 
     foreach (var grp in q) 
     { 
      double currCount = grp.Count(); 
      if (grp.Key != null) 
       returnJSON += "['" + grp.Key + "', " + currCount + "],"; 
      else 
       returnJSON += "['none', " + currCount + "],"; 
     } 
     returnJSON = returnJSON.Substring(0, returnJSON.Length - 1); 
     returnJSON += "]}]"; 

     return returnJSON; 
    } 

나는이 같은 방법에서 호출을 :

public string GetCampaignData() 
    { 
     PaymentModelDataContext db = new PaymentModelDataContext(); 
     var q = from Event in db.TrackingEvents 
       group Event by Event.campaignID; 


     return ParseJson(q); 

    } 

나는 여러 가지 쿼리 Q를 사용하는 모든 그룹화 데이터입니다.

문제는 어떤 이유로 런타임이 유형을 q에 바인딩 할 수 없다는 것입니다. 이것은 동적 인 것의 적절한 사용인가? 이 작업을 수행하는 다른 방법이 있습니까?

+0

개체 유형 (및 구조)이 알려지지 않았기 때문에 Count 속성이 없으므로 오류가 발생합니다. –

+0

.Count()는 확장 메서드이며 그룹화 IIRC에 없습니다. 이것은 아마도 .Count가 없다는 오류를 제공합니다. 개인적으로 그것을 사용하는 좋은 이유가 보이지 않기 때문에 코드를 동적으로 사용하지 않도록 리팩터링 할 수 있습니까? 또한 당신은 JSON을 작성하는 JSON을 구문 분석하지 않는다. – FuleSnabel

+1

대신에'dynamic'을 받아들이는 대신에, 당신의 메소드는 ['IGrouping ']을 받아 들여야합니다 (http://msdn.microsoft.com/en-us/library/bb344977.aspx) –

답변

4

Count()IEnumerable<T>의 확장 메소드입니다. 동적 인 클래스에서는 호출 할 수 없으므로 (클래스의 실제 메소드가 아니기 때문에) 문제가 있습니다.

foreach (var grp in q) 

우리는 다시 동적 (오프 확장 메서드를 호출 할 수 없기 때문에, 그들은 진정한 구성원이 아닌 : 그것은 동적 변수 q에 식의 결과 때문에

귀하의 변수 GRP는 동적 클래스)를 사용하려면 static 클래스 인 Enumerable 대신 명시 적으로 확장 메서드를 호출해야합니다. 그래서 당신의 코드 변경 :

double currCount = Enumerable.Count(grp); 

을 그리고 당신은 당신이 정말로 dynamic를 사용하려면 경우 Count() 제대로 작동 볼 수 있습니다.

그렇다면 @ John의 의견에 동의하지만이 점을 비 동적으로 변경해야한다고 생각합니다. 사실, 받아들이는 당신의 방법과 같이>를 IEnumerable 일 것입니다 무슨 : 만약 당신이 좋아하면

private string ParseJson<TKey,TValue>(IEnumerable<IGrouping<TKey,TValue>> q) 
    { 
     string returnJSON = "[{ \"type\" : \"pie\", \"name\" : \"Campaigns\", \"data\" : [ "; 
     foreach (var grp in q) 
     { 
      double currCount = grp.Count(); 
      if (grp.Key != null) 
       returnJSON += "['" + grp.Key + "', " + currCount + "],"; 
      else 
       returnJSON += "['none', " + currCount + "],"; 
     } 
     returnJSON = returnJSON.Substring(0, returnJSON.Length - 1); 
     returnJSON += "]}]"; 

     return returnJSON; 
    } 

또한 사용에 매개 변수 유형 제네릭이 아닌 특정을 할 수 있습니다. 그러나 이것은 모든 그룹과 함께 작동합니다 ...

+0

예, 흥미 롭습니다, 백작님의 오류에 대한 질문에 더 대답하고 있습니다 ... 더 많이 파헤겠습니다. –

+0

동적에서 파생 된 다이내믹이 다소 손실되어 매우 흥미롭고 ... –

+0

감사합니다! 저는 항상 동적 타입이 @ runtime에 바인드 된 타입을 가져 왔다고 가정했는데, 이는 컴파일 중에 아무 것도 할 수 없다는 것을 암시합니다. @ runtime이 발생하면 에러가 발생합니다. 어쨌든 조심해서 사용해야합니다. 따라서 사용하고 있다면, 내가 원하는대로하겠습니다. 어차피 내 걸릴거야 :) –

관련 문제