1

我正在使用 Silverlight 5 (VS 2010) 创建一个 C# Web 应用程序。

我最初创建了一个运行良好的控制台应用程序,现在我正在将其调整为 Web 应用程序。

即使在 Web 应用程序中,它对于特别设置的数据类型也可以正常工作(例如 forint而不是<T>它可以正常工作)但是当我使用泛型时它就不起作用了。它编译无错误,但它甚至不调试设置为“切换断点”的区域。最初的 GUI 是这样的:

在此处输入图像描述

但是当控制传递到容易出错的部分时,GUI突然像这样消失了

在此处输入图像描述

我保留断点的地方被这个取代了

在此处输入图像描述

(见最左边)因此我无法调试以找到问题

我正在尝试做的一些解释:在下面的给定代码中,我有一个二进制文件并存储在数据类型的“fileContents”中byte[](我没有向您透露读取该文件的方法,现在您可以考虑该 fileContents 包含MainPage类内二进制文件的内容)。实际上,我会将符号(形式为 0 和 1 的符号存储在二进制文件中)并找到它的频率(通过计算它在文件中重复的次数,但这没有问题,所以我没有为它编写方法)。但是我的代码中的这个变量processingValue将是通用类型(<T>"symbol"<T>shortintlongUInt32UInt64等)我没有在我的代码中显示)。

我有这样的场景:

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 
{
    public partial class MainPage: UserControl 
    {
        byte[] fileContent;
        public MainPage() 
        {
            InitializeComponent();
            fileContent = null; //Suppose it already contains binary fileContents
        }
//I press the button in order to call the Huffman class because it's Object declared in it
        public void ButtonClickEvent(object sender, RoutedEventArgs e) 
        {
            MessageBox.Show("check0");

            //Suppose i had stored contents of a file inside "fileContent" , so fileContent below contains
            //contents of a binary file
           //**THE LINE BELOW IS ERROR PRONE**
            Huffman < uint > obj1 = new Huffman < uint > (this, fileContent, BitConverter.ToUInt32);

            //This Object creation creates problem, whereas if i remove generic type (<T>), Then it works fine.
            //If i don't use genrics then i do it like this : Huffman obj1 = new Huffman(this, fileContent); (Whereas <T> in Huffman class is replaced by "int" and it works fine)

            MessageBox.Show("check1"); //This check box is never executed 
        }
    }

    public class Huffman < T > where T: struct,IComparable < T > ,IEquatable < T > 
    {
        public Huffman(MainPage Object, byte[] fileContent, Func < byte[], int, T > converter) 
        {
            MessageBox.Show("check2"); //It never executes          
            length = fileContent.Length;
            size = Marshal.SizeOf(typeof (T));
            byte[] data;
            for (long position = 0; position + size < length; position += size)
            {
                data = fileContent; //This data conatains the filecontents now
                T processingValue = converter(data, 0); 
                {
                    //I do something here with processingValue it could be int16/int32/int64/uin32/uint64 etc.
                }
            }
        }
    }
}  

BitConverterMainPage 类的对象创建中的功能有什么问题吗?

我什至无法调试 Huffman 类,我在 Huffman 类的起点和终点设置了断点,但控件没有进入,并且 Internet Explorer 上的按钮(使用 XAML GUI 创建)消失了。

这是我的完整代码:(请注意我正在读取二进制文件(任何扩展名为“.o”(FileName.o)的文件都可以用于测试我的代码,我读得很好)):

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 FinalSS
{
    public partial class MainPage : UserControl
    {
        public const int CHUNK_SIZE = 4096;
        public const string UPLOAD_URI = "http://localhost:50323/FileUpload.ashx?filename={0}&append={1}";
        public const string UPLOAD_DIALOG_FILTER = "All files (*.*)|*.*|Jpeg Images (*.jpg)|*.png|PNG Images (*.png)|*.png";
        private Stream data;
        private string fileName;
        private long TotalBytes;
        private long UploadedBytes;
        byte[] fileContent;
        public event Action simpleEvent;

        public MainPage()
        {
            InitializeComponent();
            progressBar.Visibility = Visibility.Collapsed;
            textBox.Visibility = Visibility.Collapsed;
           // fileContent = null;
            UploadedBytes = 0;
            TotalBytes = 0;                      
        }
     /*   public void comboInvoke()
        {
            comboBox1.Items.Add("byte");
            comboBox1.Items.Add("sbyte");
            comboBox1.Items.Add("short");
            comboBox1.Items.Add("int");
            comboBox1.Items.Add("long");
        }   */


        public void BrowseButtonClick(object sender, RoutedEventArgs e)
        {   OpenFileDialog dlg = new OpenFileDialog();
            dlg.Multiselect = false;
            dlg.Filter = UPLOAD_DIALOG_FILTER;
            bool? retVal = dlg.ShowDialog();

            if (retVal != null && retVal == true)
            {
                progressBar.Visibility = Visibility.Visible;
                textBox.Visibility = Visibility.Visible;
                textBox.Text = "Uploading the file...";

                data = dlg.File.OpenRead();
                TotalBytes = data.Length;
                UploadedBytes = 0;
                fileName = dlg.File.Name;
                progressBar.Maximum = TotalBytes;
                UploadFileChunk();
            }            
        }

        private void UploadFileChunk()
        {
            textBox.Text = "Upload in progress...";
            string uploadUri = "";
            if (UploadedBytes == 0)
            {
                uploadUri = String.Format(UPLOAD_URI, fileName, 0); // Dont't append
            }
            else if (UploadedBytes < TotalBytes)
            {
                uploadUri = String.Format(UPLOAD_URI, fileName, 1); // append
            }
            else
            {
                return;  // Upload finished
            }

            fileContent = new byte[CHUNK_SIZE];
            int bytesRead = data.Read(fileContent, 0, CHUNK_SIZE);
            data.Flush();

            WebClient wc = new WebClient();
            wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);
            Uri u = new Uri(uploadUri);
            wc.OpenWriteAsync(u, null, new object[] { fileContent, bytesRead });
            UploadedBytes += fileContent.Length;
            MessageBox.Show("check0");
            Huffman<uint> obj1 = new Huffman<uint>(this, fileContent, BitConverter.ToUInt32);
            MessageBox.Show("check1");
        }
        void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
        {
            progressBar.Value = UploadedBytes;
            if (e.Error == null)
            {
                object[] objArr = e.UserState as object[];
                byte[] fileContent = objArr[0] as byte[];
                int bytesRead = Convert.ToInt32(objArr[1]);
                Stream outputStream = e.Result;
                outputStream.Write(fileContent, 0, bytesRead);
                outputStream.Close();

                if (UploadedBytes < TotalBytes)
                {
                    UploadFileChunk();
                }
                else
                {
                    textBox.Text = fileName;
                }
            }

        }
        /// <summary>
        /// ///////////////////////////////////////////////////////
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void ShowButtonClick(object sender, RoutedEventArgs e)
        {
            if (simpleEvent != null) simpleEvent();
        }

        private void CompressButtonClick(object sender, RoutedEventArgs e)
        {

        }

        private void CloseButtonClick(object sender, RoutedEventArgs e)
        {

        }

        private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void textBox_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {

        }

        private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void listBox2_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void TreeViewItem_Selected_1(object sender, RoutedEventArgs e)
        {

        }

        private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
        {

        }
    }

    public class Huffman<T> where T : struct, IComparable<T>, IEquatable<T> 
    {        
       long length;
       int size;
       byte[] data;
        public class Node
        {
            public Node next, left, right;
            public T symbol;   // This symbol is of generic type.
            public int freq;
            public int is_processed;

        }
        public Node front, rear;
        public Huffman(MainPage form, byte[] fileContent,Func < byte[], int, T > converter)
        {
           MessageBox.Show("check2");
            //    form.simpleEvent += () => ShowClick(form,fileContent);
           length = 0;
            front = null;
            rear = null;
            MessageBox.Show("check4");
            length = fileContent.Length;
            size = Marshal.SizeOf(typeof(T));
            Stream stream = new MemoryStream(fileContent);
            {
                for (long position = 0; position + size < length; position += size)
                {
                    data = fileContent;
                    T processingValue = converter(data, 0);
                    {
                        Node pt, temp;
                        bool is_there = false;
                        pt = front;
                        while (pt != null)
                        {
                            form.listBox1.Visibility = Visibility.Visible;
                            if (pt.symbol.Equals(processingValue))
                            {
                                pt.freq++;
                                is_there = true;

                                break;
                            }
                            temp = pt;
                            pt = pt.next;
                        }
                        if (is_there == false)
                        {
                            temp = new Node();
                            temp.symbol = processingValue;
                            temp.freq = 1;
                            temp.left = null;
                            temp.right = null;
                            temp.next = null;
                            temp.is_processed = 0;
                            if (front == null)
                            {
                                front = temp;
                            }
                            else
                            {
                                temp.next = front;
                                front = temp;
                            }
                        }
                    }
                }
                stream.Close();
            }

            MessageBox.Show("Yes correctly done");
            merge_sort(front);
            Print_tree(front, form);
        }
         public Node merge_sort(Node head)
         {
             if (head == null || head.next == null)
             {
                 return head;
             }
             Node middle = getMiddle(head);
             Node sHalf = middle.next;
             middle.next = null;
             return merge(merge_sort(head), merge_sort(sHalf));
         }
         public Node merge(Node a, Node b)
         {
             Node dummyHead, curr;
             dummyHead = new Node();
             curr = dummyHead;
             while (a != null && b != null)
             {
                 if (a.freq <= b.freq)
                 {
                     curr.next = a;
                     a = a.next;
                 }
                 else
                 {
                     curr.next = b;
                     b = b.next;
                 }
                 curr = curr.next;
             }
             curr.next = (a == null) ? b : a;
             return dummyHead.next;
         }
         public Node getMiddle(Node head)
         {
             if (head == null)
             {
                 return head;
             }
             Node slow, fast;
             slow = fast = head;
             while (fast.next != null && fast.next.next != null)
             {
                 slow = slow.next;
                 fast = fast.next.next;
             }
             return slow;
         }
       ///////
         public void Print_tree(Node treee,MainPage obj)
         {
             Node pt = treee;
             while (pt != null)
             {
                 obj.listBox1.Items.Add("Symbol :" + pt.symbol + " -" + " Frequency : " + pt.freq);
                 //  Debug.WriteLine("Symbol :" + pt.symbol + " -" + " Frequency : " + pt.freq);
                 pt = pt.next;
             }
         }

   }
}

这是xml代码:

<UserControl x:Class="FinalSS.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
              xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">

<Grid x:Name="LayoutRoot" Background="Wheat" Visibility="Visible" Height="348" Width="681">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="37*" />
            <ColumnDefinition Width="86*" />
            <ColumnDefinition Width="558*" />
        </Grid.ColumnDefinitions>
        <sdk:TreeView SelectedItemChanged="TreeView_SelectedItemChanged" Margin="12,12,12,41" Background="wheat" Grid.ColumnSpan="3">
            <sdk:TreeViewItem Header="File" Selected="TreeViewItem_Selected" >
                <sdk:TreeViewItem.Items>
                    <sdk:TreeViewItem Selected="TreeViewItem_Selected_1">
                        <sdk:TreeViewItem.Header>
                            <StackPanel Orientation="Horizontal" >
                                <Button Content="Browse File"  Width="76" Height="20" Click="BrowseButtonClick"></Button>
                            </StackPanel>
                        </sdk:TreeViewItem.Header>
                    </sdk:TreeViewItem>
                    <sdk:TreeViewItem Selected="TreeViewItem_Selected_1">
                        <sdk:TreeViewItem.Header>
                            <StackPanel Orientation="Horizontal">
                                <Button Content="Show Data" Width="75" Height="20" Click="ShowButtonClick"></Button>
                            </StackPanel>
                        </sdk:TreeViewItem.Header>
                    </sdk:TreeViewItem>
                    <sdk:TreeViewItem Selected="TreeViewItem_Selected_1">
                        <sdk:TreeViewItem.Header>
                            <StackPanel Orientation="Horizontal">
                                <Button Content="Compress" Width="75" Height="20" Click="CompressButtonClick"></Button>
                            </StackPanel>
                        </sdk:TreeViewItem.Header>
                    </sdk:TreeViewItem>
                    <sdk:TreeViewItem Selected="TreeViewItem_Selected_1">
                        <sdk:TreeViewItem.Header>
                            <StackPanel Orientation="Horizontal">
                                <Button Content="close"   Width="75" Height="20" Click="CloseButtonClick" ></Button>
                            </StackPanel>
                        </sdk:TreeViewItem.Header>
                    </sdk:TreeViewItem>
                </sdk:TreeViewItem.Items>
            </sdk:TreeViewItem>
        </sdk:TreeView>
        <ProgressBar Name="progressBar" Height="9" HorizontalAlignment="Left" Margin="216,82,0,0"  VerticalAlignment="Top" Width="139" Foreground="#FF3AB802" Grid.Column="2" Visibility="Collapsed" />
        <TextBox Name="textBox" Height="23" HorizontalAlignment="Left" Margin="146,68,0,0"  VerticalAlignment="Top" Width="66" Grid.Column="2" TextChanged="textBox_TextChanged" Visibility="Collapsed" />
        <ListBox Height="148" HorizontalAlignment="Left" Margin="0,152,0,0" Name="listBox1" VerticalAlignment="Top" Width="197" ItemsSource="{Binding}" Visibility="Collapsed" Grid.Column="2" SelectionChanged="listBox1_SelectionChanged"></ListBox>
        <ListBox Height="148" HorizontalAlignment="Right" Margin="0,154,160,0" Name="listBox2" VerticalAlignment="Top" Width="203" SelectionChanged="listBox2_SelectionChanged" Visibility="Collapsed" Grid.Column="2">
            <ListBoxItem />
            <ListBoxItem />
        </ListBox>
        <ComboBox Height="19" HorizontalAlignment="Left" Margin="13,204,0,0" Name="comboBox1" VerticalAlignment="Top" Width="104" SelectionChanged="comboBox1_SelectionChanged" Grid.ColumnSpan="2">
            <ComboBoxItem />
            <ComboBoxItem />
        </ComboBox>
    </Grid>
</UserControl>

就我的保证而言,这个问题是由于 Huffman 构造函数中的BitConverter调用函数 Func 转换器造成的问题。我想我需要以其他方式使用 Func 转换器非常感谢您的帮助。

4

1 回答 1

1

我可能错了,但是...

我不知道您是否可以在不添加更多代码的情况下做您正在做的事情-

<T>

实际上是数据类型的占位符,编译器使用它来创建与该类型一起使用的类。当您指定具有该类类型的变量时,编译器会创建类/函数。

在我看来,您正试图在运行时创建此类型,然后调用此函数。通过这样做,您不允许编译器创建方法/类来支持您的变量类型。

您可能需要在某个虚拟文件中为每种类型声明一个类,以便编译器为这些类型生成类。

看看这篇文章了解更多信息:http ://www.cs.umd.edu/class/fall2002/cmsc214/Projects/P2/proj2.temp.html

于 2014-04-06T23:23:21.360 回答