2010-10-04 3 views
2

Я знаю, что могу решить следующую проблему, просто создав собственный класс, но могу ли быть строго типизировано как List (или любой другой тип)?Возможно ли это использование дженериков? C#

var x = new object[] 
     { 
      new object[] { new Image(), new TextBox(), new FileUpload() }, 
      new object[] { new Image(), new TextBox() , new FileUpload()} 
     }; 

Типы объектов в приведенном выше коде являются, например.

Это конец дня, и мой мозг стал мягким.

Редактировать: Кортеж?

ответ

8

Да, общий Кортеж будет работать:

http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

var myTuples = new List<Tuple<type1, type2, type3>>(); 
+0

Ницца! Еще один пример того, почему мне нравится просматривать stackoverflow ... Узнайте, что-то новое каждый день. Никогда не знаю о кортежах ... –

4
var x = new []   
{    
    new 
    { 
     Image = new Image(), 
     TextBox = new TextBox(), 
     FileUpload = new FileUpload() 
    }, 
    new 
    { 
     Image = new Image(), 
     TextBox = new TextBox(), 
     FileUpload = new FileUpload() 
    }   
}; 
+1

Хотя дочерние массивы были бы лучше, например, new {Image = ..., TextBox = ... и т. д. –

+0

Да, я пытался отредактировать, чтобы добавить это тоже ... code formatter кажется довольно сломанным ... каждый раз, когда я хочу добавить код, он помещает местозаполнитель где-то, я хочу, чтобы это было. –

1

Вы не указали, но это выглядит, как вы используете типы из System.Web? Если да, то дженерики можно использовать для создания более строго типизированной коллекции. Например

List<List<WebControl>> list = new List<List<WebControl>>(); 
list.Add(new List<WebControl>(new WebControl()[] new Image(), new TextBox(), new FileUpload 
()); 
list.Add(new List<WebControl>(new WebControl()[] new Image(), new TextBox(), new FileUpload()); 

Для того, чтобы получить очень сильно типизированных коллекцию, хотя вы должны привести к Tuple<> или анонимному решению типа.

1

Вы можете использовать Tuple, как вы говорите. Или анонимный тип:

var x = new[] 
    { 
     new { Image = new Image(), TextBox = new TextBox(), FileUpload = new FileUpload() }, 
     new { Image = new Image(), TextBox = new TextBox(), FileUpload = new FileUpload() } 
    }; 
0

Tuple<Image, TextBox, FileUpload>[] или, возможно, List<Tuple<Image, TextBox, FileUpload>> будет делать трюк, если вы используете рамки 4.

В противном случае вы можете использовать анонимный тип, хотя это может быть неудобно за что (так как вы можете 't объявлять тип в тех случаях, когда это полезно).

Наконец, это не самая сложная структура, которая просто сворачивает ваши собственные.

1

Анонимные объекты строго типизирован. Единственная проблема заключается в том, что вы не можете узнать имя (не напрямую).

Возьмите этот пример (простите, если он слишком длинный):

 static void T2() 
    { 
     var x = new 
     { 
      a = new { a1 = new Type1("x.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("x.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     var y = new 
     { 
      a = new { a1 = new Type1("y.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("y.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     var z = new 
     { 
      a = new { a1 = new Type1("y.1"), a2 = new Type3('1') }, 
      b = new { b1 = new Type3('z'), b2 = new Type2(2) } 
     }; 

     Console.WriteLine(new string('-', 40)); 
     Console.WriteLine("Anonymous object \"x\" is named {0}.", x.GetType()); 
     Console.WriteLine("Anonymous object \"y\" is named {0}.", y.GetType()); 
     Console.WriteLine("Anonymous object \"z\" is named {0}.", z.GetType()); 

     Console.WriteLine(new string('-', 40)); 
     Console.Write("Anonymous object \"x\" == \"y\"? "); 
     Console.WriteLine(x.Equals(y) ? "Yes" : "No"); 

     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 

     var x2 = new 
     { 
      a = new { a1 = new Type1("x.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("x.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     Console.Write("Anonymous object \"x\" == \"x2\"? "); 
     Console.WriteLine(x.Equals(x2) ? "Yes" : "No"); 

     // Uncomment it to give: 
     //Error 1 Cannot implicitly convert type 'AnonymousType#1' to 'AnonymousType#2' 
#if GiveMeAnError 
     z = new 
     { 
      a = new { a1 = new Type1("z.1"), a2 = new Type2(1), a3 = new Type3('1') }, 
      b = new { b1 = new Type1("z.2"), b2 = new Type2(2), b3 = new Type3('2') } 
     }; 

     Console.WriteLine("Anonymous object \"z\" now is named {0}.", z.GetType()); 

     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 
#endif 
     Console.ReadKey(); 
    } 

Он выводит:

/*---------------------------------------- 
Anonymous object "x" is named <>f__AnonymousType2`2[<>f__AnonymousType0`3 [anon_obj.Type1,anon_obj.Type2,anon_obj.Type3],<>f__AnonymousType1`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3]]. 
Anonymous object "y" is named <>f__AnonymousType2`2[<>f__AnonymousType0`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3],<>f__AnonymousType1`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3]]. 
Anonymous object "z" is named <>f__AnonymousType2`2[<>f__AnonymousType3`2[anon_obj.Type1,anon_obj.Type3],<>f__AnonymousType4`2[anon_obj.Type3,anon_obj.Type2]]. 
---------------------------------------- 
Anonymous object "x" == "y"? No 
Anonymous object "x" == "z"? No 
Anonymous object "x" == "x2"? Yes*/ 

Каждый анонимный состав объекта имеет свое собственное имя и определяет уникальный тип. Объекты, объявленные с теми же типами и именами типов, переходят в тот же тип, что и в «x == x2».

Исходный пример, однако, является сложным, так как он определяет «объект []» массивы с массивами «object []» внутри. Таким образом

  var x = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     var y = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("y.2"), new Type2(2) , new Type3('2')} 
     }; 

     var z = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type3('1') }, 
      new object[] { new Type3('z'), new Type2(2)} 
     }; 

все будет то же самое тип (объект []), и сравнение будет сделано ВСЕГДА сравнивая указатели, которые будут, hopefuly, отличаются.

 static void T1() 
    { 
     var x = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     var y = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("y.2"), new Type2(2) , new Type3('2')} 
     }; 

     var z = new object[ ] 
     { 
      new object[] { new Type1("y.1"), new Type3('1') }, 
      new object[] { new Type3('z'), new Type2(2)} 
     }; 

     Console.WriteLine(new string('-', 40)); 
     Console.WriteLine("Anonymous object \"x\" is named {0}.", x.GetType()); 
     Console.WriteLine("Anonymous object \"y\" is named {0}.", y.GetType()); 
     Console.WriteLine("Anonymous object \"z\" is named {0}.", z.GetType()); 


     Console.WriteLine(new string('-', 40)); 
     Console.Write("Anonymous object \"x\" == \"y\"? "); 
     Console.WriteLine(x.Equals(y) ? "Yes" : "No"); 

     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 

     var x2 = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     Console.Write("Anonymous object \"x\" == \"x2\"? "); 
     Console.WriteLine(x.Equals(x2) ? "Yes" : "No"); 

     z = new object[ ] 
     { 
      new object[] { new Type1("x.1"), new Type2(1), new Type3('1') }, 
      new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')} 
     }; 

     Console.WriteLine("Anonymous object \"z\" now is named {0}.", z.GetType()); 


     Console.Write("Anonymous object \"x\" == \"z\"? "); 
     Console.WriteLine(x.Equals(z) ? "Yes" : "No"); 

     Console.Write("Anonymous object \"x\" == \"z\" (memberwise)? "); 
     Console.WriteLine(
      x[ 0 ].Equals(z[ 0 ]) 
      && x[ 1 ].Equals(z[ 1 ]) 
      ? "Yes" : "No"); 

     Console.ReadKey(); 
    } 

Выведет:

/*---------------------------------------- 
Anonymous object "x" is named System.Object[]. 
Anonymous object "y" is named System.Object[]. 
Anonymous object "z" is named System.Object[]. 
---------------------------------------- 
Anonymous object "x" == "y"? No 
Anonymous object "x" == "z"? No 
Anonymous object "x" == "x2"? No 
Anonymous object "z" now is named System.Object[]. 
Anonymous object "x" == "z"? No 
Anonymous object "x" == "z" (memberwise)? No 
----------------------------------------*/ 

См Гоча?