2

我知道我可以通过创建自定义类来解决以下问题,但是可以将以下内容强类型化为List(或任何其他类型)吗?

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

上面代码中的对象类型只是举例。

一天结束了,我的大脑有点软了。

编辑:元组?

4

6 回答 6

8

是的,通用元组可以工作:

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

var myTuples = new List<Tuple<type1, type2, type3>>();
于 2010-10-04T16:23:13.787 回答
4
var x = new []         
{             
    new 
    { 
        Image = new Image(), 
        TextBox = new TextBox(), 
        FileUpload = new FileUpload() 
    },
    new 
    { 
        Image = new Image(), 
        TextBox = new TextBox(), 
        FileUpload = new FileUpload()
    }         
};
于 2010-10-04T16:22:56.907 回答
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<>或匿名类型的解决方案。

于 2010-10-04T16:24:44.543 回答
1

你可以像你说的那样使用元组。或匿名类型:

var x = new[] 
    { 
        new { Image = new Image(), TextBox = new TextBox(), FileUpload = new FileUpload() }, 
        new { Image = new Image(), TextBox = new TextBox(), FileUpload = new FileUpload() }
    };
于 2010-10-04T16:24:51.473 回答
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[]”数组,其中包含“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)}  
        };

都将是相同的类型(object[]),并且比较总是通过比较指针来完成,希望会有所不同。

        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
----------------------------------------*/

看到问题了吗?

于 2010-10-04T18:38:05.333 回答
0

如果您使用的是框架 4,ATuple<Image, TextBox, FileUpload>[]或者可能会成功。List<Tuple<Image, TextBox, FileUpload>>

否则,您可以使用匿名类型,尽管除此之外它可能会很尴尬(因为在有用的情况下您不能声明该类型)。

最后,仅仅滚动你自己的结构并不是最棘手的结构。

于 2010-10-04T16:25:35.370 回答