2011-09-21 18 views
13

क्या मैं किसी अज्ञात प्रकार को फ़ंक्शन में रिटर्न प्रकार के रूप में उपयोग कर सकता हूं, और तब सामान जो किसी सरणी या किसी प्रकार के संग्रह में मूल्य लौटाता है, जबकि नए सरणी/संग्रह में अतिरिक्त फ़ील्ड जोड़ता है? मेरी स्यूडोकोड बहाना ...फ़ंक्शन से बेनामी प्रकार वापसी

private var GetRowGroups(string columnName) 
{ 
var groupQuery = from table in _dataSetDataTable.AsEnumerable() 
          group table by new { column1 = table[columnName] } 
           into groupedTable 
           select new 
           { 
            groupName = groupedTable.Key.column1, 
            rowSpan = groupedTable.Count() 
           }; 
    return groupQuery; 

} 

private void CreateListofRowGroups() 
{ 
    var RowGroupList = new List<????>(); 
    RowGroupList.Add(GetRowGroups("col1")); 
    RowGroupList.Add(GetRowGroups("col2")); 
    RowGroupList.Add(GetRowGroups("col3")); 

} 
+0

के संभावित डुप्लिकेट [एक्सेस करना सी # बेनामी प्रकार वस्तुओं] (http://stackoverflow.com/questions/713521/accessing-c-sharp -नानाम-प्रकार-ऑब्जेक्ट्स) – nawfal

+0

[वापसी का अनाम प्रकार?] (http://stackoverflow.com/questions/534690/return-anonymous-type) के संभावित डुप्लिकेट –

उत्तर

11

यह very popular question है। सामान्य रूप से आप मजबूत टाइपिंग की आवश्यकता के कारण एक अनाम प्रकार वापस नहीं कर सकते हैं। हालांकि कुछ कामकाज हैं।

  1. वापसी मूल्य का प्रतिनिधित्व करने के लिए एक सरल प्रकार बनाएं। (here और here देखें)। इसे generating from usage द्वारा सरल बनाएं।
  2. कास्टिंग के लिए नमूना उदाहरण का उपयोग करके cast to the anonymous type पर एक सहायक विधि बनाएं।
+1

कृपया हमेशा बाहरी लिंक से थोड़ा स्निपेट उद्धृत करें। इस मामले में, पहला तोड़ दिया गया है, इसलिए आपका जवाब काफी बेकार है। – Teejay

+0

"उपयोग से उत्पन्न" लिंक टूटा हुआ है – dlchambers

+0

@dlchambers: धन्यवाद। मैंने लिंकबैक मशीन से एक संग्रह का उपयोग करने के लिए लिंक बदल दिया। – mellamokb

12

नहीं, तुम नहीं कर सकते हैं वापसी विधि से एक गुमनाम प्रकार। अधिक जानकारी के लिए this एमएसडीएन दस्तावेज़ पढ़ें। anonymous प्रकार के बजाय class या struct का उपयोग करें।

आप ब्लॉग पोस्ट पढ़ना चाहिए - Horrible grotty hack: returning an anonymous type instance

आप ढांचे 4.0 का उपयोग कर रहे हैं तो आप List<dynamic> लौट लेकिन अनाम ऑब्जेक्ट के गुणों को एक्सेस करने के लिए सावधान हो सकता है।

private List<dynamic> GetRowGroups(string columnName) 
{ 
var groupQuery = from table in _dataSetDataTable.AsEnumerable() 
          group table by new { column1 = table[columnName] } 
           into groupedTable 
           select new 
           { 
            groupName = groupedTable.Key.column1, 
            rowSpan = groupedTable.Count() 
           }; 
    return groupQuery.ToList<dynamic>(); 
} 
4

नहीं, आप सीधे एक अनाम प्रकार वापस नहीं कर सकते हैं, लेकिन आप इसे impromptu interface का उपयोग करके वापस कर सकते हैं। कुछ इस तरह:

public interface IMyInterface 
{ 
    string GroupName { get; } 
    int RowSpan { get; } 
} 

private IEnumerable<IMyInterface> GetRowGroups() 
{ 
    var list = 
     from item in table 
     select new 
     { 
      GroupName = groupedTable.Key.column1, 
      RowSpan = groupedTable.Count() 
     } 
     .ActLike<IMyInterface>(); 

    return list; 
} 
+1

प्यारा, हालांकि मुझे यकीन नहीं है कि यह टाइप कंक्रीट बनाने से कहीं अधिक आसान है ... (आईडीई की टूलिंग में टूलिंग मदद कर सकता है) –

1

उपयोग object, नहीं var। अनामित प्रकार के दायरे के बाहर गुणों तक पहुंचने के लिए आपको प्रतिबिंब का उपयोग करना होगा।

यानी

private object GetRowGroups(string columnName) 
... 
var RowGroupList = new List<object>(); 
... 
+0

इसे बाद में 'गतिशील' (सी # 4) के माध्यम से एक्सेस किया जा सकता है ... हालांकि यह सभी व्यावहारिक प्रकार की सुरक्षा खो देता है। –

2

बस का उपयोग करें और ArrayList

public static ArrayList GetMembersItems(string ProjectGuid) 
    { 
     ArrayList items = new ArrayList(); 

       items.AddRange(yourVariable 
         .Where(p => p.yourproperty == something) 
         .ToList()); 
      return items; 
    } 
संबंधित मुद्दे