0

C# Web アプリケーションでジェネリックを作成し、silverlight-5 を使用しようとしています。これは、C# コンソール アプリケーションに既に実装されています。

Vs-2010でasp.net、c#、およびsilverlight(およびxamlを使用したGUI)を使用して、webdevelopmentで同じことをしようとしています。その GUI は、コードの実行時に Internet Explorer に表示されます (ボタン クリック イベントによる)。

コンソールアプリケーションでは、次のコードでこれを行います:(コードは、コンソールアプリケーションの唯一の引数としてバイナリファイルを読み取り、そのファイル内のシンボルを読み取ることです。これらsymbolは可能性がありますint32/int16/int64/UInt32)。したがって、このSymbol変数を「ジェネリック」( <T>) にする必要があります。コンソール アプリケーションでは、このコードは正常に動作します。

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;



    namespace check 
    {
LINE:1  public class Huffman < T > where T: struct,IComparable < T >,IEquatable < T > 
        {
            public int data_size, length, i, is_there;
            public class Node 
            {
                public Node next;
line:2          public T symbol; // This symbol is of generic type.
                public int freq;
             }
            public Node front, rear;
LINE:3         public Huffman(string[] args, Func < byte[], int, T > converter) 
            {
                front = null;
                rear = null;
                int size = Marshal.SizeOf(typeof (T));
                using(var stream = new BinaryReader(System.IO.File.OpenRead(args[0]))) 
                {
                    long length = stream.BaseStream.Length;
                    for (long position = 0; position + size < length; position += size)
                    {
                        byte[] bytes = stream.ReadBytes(size);
LINE:4                  T processingValue = converter(bytes, 0); //**Here I read that symbol and store in processing value which is of type <T>** 
                        //Then  further i use this processingValue and "next" varible(which is on Node type)
                    }
                }
            }
        }

        public class MyClass
        {
            public static void Main(string[] args)
            {
    line:5            Huffman < long > ObjSym = new Huffman < long > (args, BitConverter.ToInt64); 
                    // It could be "ToInt32"/"ToInt16"/"UInt16"/"UInt32"/"UInt64" with respective 
                    //change in <int>/<short> etc.



                //Then i further use this ObjSym object to call function(Like Print_tree() here and there are many more function calls)   
                ObjSym.Print_tree(ObjSym.front);
            }
        }
    }

C#silverlight(Webアプリケーション)で達成しなければならないのと同じことですが、ボタンをクリックして(参照することで)ファイルをすでにアップロードして保存しているという違いがあります(一方、コンソールアプリケーションで唯一の引数としてファイルをアップロード/読み取りました)、このファイルのアップロード部分は、すでに行っています。

問題は、ここでこの「シンボル」変数を generic( <T>)にする方法です。これは、パラメーター BitConverter.ToInt32/64/16 (コンソール アプリケーションで行っているので、コードを参照してください)。

注:コードのLINE 1,2,3,4,5で使用したことを確認してください(そのため、以下のコードで「シンボル」を作成するには、同じ(または他のアプローチがある場合は異なる)を達成する必要があります)タイプ )

C#では、このようなコードの本体を取得するため

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace check
{
    public partial class MainPage : UserControl
    {
         public class Node
        {
            public Node next;
            public long symbol;   // This symbol is of generic type.
            public int freq;
        }
        public Node front, rear;

       public MainPage()
        {
            InitializeComponent();
        }

    }
}

このWebアプリケーションのコードをコンソールアプリケーションのコードとまったく同じように変更するのを手伝ってくれませんか(「Symbol variable as generic<T>)」を作成することを意味します)

編集:私がこれを行うとき:

(1) public partial class MainPage <T> : UserControl, IComparable < T > where T: struct,IEquatable < T > 
(2) public T symbol; (In Node class)
(3) And all the buttons and boxes i created are given not existing in current context.

その後、エラーが発生します

Error :The name 'InitializeComponent' does not exist in the current context 

c# Silverlight Webアプリケーションで同じことを達成するのを手伝ってくれませんか? 大きな助けになるでしょう、ありがとう。

4

2 に答える 2

1

XAML を使用しないかのようにジェネリックを使用できます。ただし、XAML を使用してコントロールを定義する場合は、ジェネリックを使用できません。それが問題が発生する理由です。

別のクラスを作成して使用します。お手伝いだと思います。

于 2014-04-04T15:03:21.713 に答える
1

これが例です。

    namespace check
    {    
       public partial class MainPage : UserControl
       {
            public MainPage()
            {
                InitializeComponent();
                // Use the generic type Test with an int type parameter.
                Test<int> Test1 = new Test<int>(5);
                // Call the Write method.
                Test1.Write();

                // Use the generic type Test with a string type parameter.
                Test<string> Test2 = new Test<string>("cat");
                Test2.Write();
            }
       }

       class Test<T>
       {
           T _value;    
           public Test(T t)
           {
              // The field has the same type as the parameter.
              this._value = t;
           }    
           public void Write()
           {
              MessageBox.Show(this._value);
           }
       }
   }

このような例を尋ねていると思います。

于 2014-04-05T14:09:55.477 に答える