当对象存储在链接列表中时,C#访问对象 /对象方法



此应用程序应该是区块链的工作方式的一种演示。我有一个块链类和一个块类,并且程序类是主要的。在区块链类中,我正在创建一个初始块,称为createGenesisBlock((方法中的GenSis块。在我的区块链类的构造函数中,我称为createGenesisBlock((方法,并将对象插入我的链接列表中,称为链。我的问题是,当对象被添加到我的区块链类中的链接列表时,我将无法访问对象或方法。我要完成的工作是在区块链类中使用我的getLateStblock((方法来检索链中最后一个对象的哈希值。因此,可以在区块链中调用我的addBlock方法,以设置上之前的值等于链接列表中对象的值的值

namespace BlockChainProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Blockchain blockChain = new Blockchain();
            blockChain.addBlock();
            blockChain.display();
            Console.ReadKey();
        }
    }
}
namespace BlockChainProject
{
    class Block
    {
        private int index;
        private string timeStamp;
        private string data;
        private string previousHash;
        private string hash;

        public Block(int index, string timeStamp, string data, string previousHash) {
            this.index = index;
            this.timeStamp = timeStamp;
            this.data = data;
            this.previousHash = previousHash;
            this.hash = this.calculateHash();
        }
        public string calculateHash() {
            SHA256Managed hashString = new SHA256Managed();
            byte[] dataArray = hashString.ComputeHash(Encoding.UTF8.GetBytes(index.ToString() + previousHash + timeStamp + data));
            StringBuilder stringBuilder = new StringBuilder();
            foreach (byte x in dataArray)
            {
                stringBuilder.AppendFormat("{0:X2}", x);
            }
            string hashed = stringBuilder.ToString();
            return hashed;
        }
        public string getHash() {
            return hash;
        }
    }
}
namespace BlockChainProject
{
    class Blockchain
    {
        LinkedList<object> chain;
        private int index = 0;
        private string time = DateTime.Now.ToString();
        public Blockchain(){
            chain = new LinkedList<object>();
            chain.AddLast(createGenesisBlock());
        }
        private object createGenesisBlock() {
            index++;
            return new Block(index, time, "Genesis Block", "0"); ;
        }
        public object getLatestBlock() {
            return chain.Last.Value;
        }
        public void addBlock() {
            string data = Console.ReadLine();
            //string previousHash = <The hash of linked lists last object here>;
            chain.AddLast(new Block(index, time, data, previousHash));
            index++;
        }
        public void display() {
            foreach (var item in chain)
            {
                Console.WriteLine(item);
            }
        }
    }
}

我迅速运行了您的代码,我认为我已经弄清楚了您的问题。您需要在"对象"上进行查找并替换为"块",或者您需要施放从getlast函数返回到" block"的对象。

更改的一个示例看起来像:

LinkedList<Block> chain;

...

public Block getLatestBlock() {
    return chain.Last.Value;
}

这是一些要对区块链类进行更改的示例。

现在,当您调用显示功能时,您可以访问链接列表中每个块类实例的函数和方法,例如:

public void display()
{
    foreach (var item in chain)
    {
        Console.WriteLine(item.getHash());
    }
}

这将在更改链接列表中使用对象的所有返回,类型和实例的情况下,现在打印一个哈希的列表。

这样做的原因是,如果您创建一个通用"对象" s的链接列表,则在编译时间C#不知道链接列表中可能是什么。它可能是块,也可以是香蕉,因此它不知道每个对象都可以使用哪些功能和方法。因此,要让C#知道我们必须在从列表中获取物品后,或者在您的情况下使用" AS AS Block"进行将其施加您不会有列表的通用条目。

希望这可以回答您的问题。如果不是让我知道。

当您将链条指定为

LinkedList<object> chain

您正在告诉编译器,链变量是包含对象类或对象的任何后代的链接列表。

因此,以下代码是合法的,您对链条的定义

是合法的
chain.Add("Hi there!");
chain.Add(new Dictionary<int, decimal>());
chain.Add(new Giraffe());
chain.Add(42);

您无法调用calculateHash(),因为不幸的是,我们的字符串,字典,长颈鹿和INT类都不知道该方法如何调用。

而是应将链条声明为

LinkedList<Block> chain;

这意味着链只能包含类型块的元素(或块的后代类(。

虽然对这些方法的调用未显示在代码中,但您需要将createGenesisBlock()getLatestBlock()方法更改为返回块而不是对象,因为您不允许您仅将任何对象添加到链接列表中,IT必须是一个块。

相关内容

  • 没有找到相关文章

最新更新