C # - «Объект» не содержит определения для «ComputeHash» - PullRequest
0 голосов
/ 23 августа 2011

Программа делает подобные вещи снова и снова. Я хочу уменьшить код, который я использую. Это пример, в этом примере он не нужен, но в будущем я сделаю нечто подобное. Теперь я запутался и сказал: «Почему я должен копировать одни и те же коды один за другим?»

Но я получаю, что «Object» не содержит определения для ошибки «ComputeHash». Во время выполнения они не будут объектами, они являются классами. Таким образом, они не имеют одинаковый тип переменной. Что мне делать?

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog op = new OpenFileDialog();
    op.Filter = "ALL files(*.*)|*.*";
    if (op.ShowDialog() == DialogResult.OK)
    {
        textBox1.Text = String.Empty;
        var list = new ArrayList() { crc32, md5, sha1 };
        foreach (var checksum in list)
        {
            using (FileStream fs = File.Open(op.FileName, FileMode.Open))
            {
                foreach (byte b in checksum.ComputeHash(fs))
                {
                    hash += b.ToString("x2").ToLower();
                }
                textBox1.Text += hash + "\r\n";
                hash = String.Empty;
            }
        }
    }
}

1 Ответ

8 голосов
/ 23 августа 2011

Это потому, что вы используете неуниверсальный тип ArrayList. Если вы измените его на:

var list = new List<HashAlgorithm> { crc32, md5, sha1, ... };

все будет хорошо. По сути, тип времени компиляции checksum в настоящее время object, а не HashAlgorithm.

Вы должны использовать строго типизированные коллекции, когда можете.

(Вы также должны использовать операторы using для потоков - в настоящее время вы не закрываете поток.) ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...