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のタイプを使用しているように見えますか?その場合、yesジェネリックを使用して、より強く型付けされたコレクションを作成できます。例えば

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を使用している場合は、Tuple<Image, TextBox, FileUpload>[]またはおそらくそのトリックを実行します。List<Tuple<Image, TextBox, FileUpload>>

それ以外の場合は、匿名タイプを使用できますが、それを超えると厄介になる可能性があります(それが役立つ場合はタイプを宣言できないため)。

最後に、自分でロールするのは最も難しい構造ではありません。

于 2010-10-04T16:25:35.370 に答える