c#当对象存储在链表中时访问对象/对象方法

c#当对象存储在链表中时访问对象/对象方法,c#,hash,linked-list,blockchain,C#,Hash,Linked List,Blockchain,这个应用程序应该是区块链工作原理的一种演示。我有一个区块链类和一个区块类,程序类是main。在区块链类中,我正在createGenesisBlock()方法中创建一个名为gensis块的初始块。在区块链类的构造函数中,我调用createGenesisBlock()方法,并将对象插入名为chain的链表中。我的问题是,当对象被添加到我的区块链类的链表中时,我无法访问该对象或方法。我试图完成的是在区块链类中使用我的getLatestBlock()方法来检索放入区块链的最后一个对象的哈希值。因此,可以

这个应用程序应该是区块链工作原理的一种演示。我有一个区块链类和一个区块类,程序类是main。在区块链类中,我正在createGenesisBlock()方法中创建一个名为gensis块的初始块。在区块链类的构造函数中,我调用createGenesisBlock()方法,并将对象插入名为chain的链表中。我的问题是,当对象被添加到我的区块链类的链表中时,我无法访问该对象或方法。我试图完成的是在区块链类中使用我的getLatestBlock()方法来检索放入区块链的最后一个对象的哈希值。因此,可以在区块链中调用我的addBlock方法,将previousHash的值设置为链接列表中对象的哈希值

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);
            }
        }

    }
}
命名空间区块链项目
{
班级计划
{
静态void Main(字符串[]参数)
{
区块链区块链=新区块链();
blockChain.addBlock();
blockChain.display();
Console.ReadKey();
}
}
}
命名空间区块链项目
{
类块
{
私有整数索引;
私有字符串时间戳;
私有字符串数据;
私有字符串previousHash;
私有字符串散列;
公共块(int索引、字符串时间戳、字符串数据、字符串previousHash){
这个指数=指数;
this.timeStamp=时间戳;
这个数据=数据;
this.previousHash=previousHash;
this.hash=this.calculateHash();
}
公共字符串calculateHash(){
SHA256Managed hashString=新的SHA256Managed();
byte[]dataArray=hashString.ComputeHash(Encoding.UTF8.GetBytes(index.ToString()+previousHash+时间戳+数据));
StringBuilder StringBuilder=新的StringBuilder();
foreach(数据数组中的字节x)
{
AppendFormat(“{0:X2}”,x);
}
字符串哈希=stringBuilder.ToString();
返回散列;
}
公共字符串getHash(){
返回散列;
}
}
}
命名空间区块链项目
{
类区块链
{
链接列表链;
私有整数指数=0;
私有字符串time=DateTime.Now.ToString();
公共区块链(){
链=新链接列表();
AddLast(createGenesisBlock());
}
私有对象createGenesisBlock(){
索引++;
返回新块(索引,时间,“Genesis块”,“0”);
}
公共对象getLatestBlock(){
返回链最后一个值;
}
公共void addBlock(){
字符串数据=Console.ReadLine();
//字符串previousHash=;
AddLast(新块(索引、时间、数据、previousHash));
索引++;
}
公共空间显示(){
foreach(链中的var项目)
{
控制台写入线(项目);
}
}
}
}

我快速运行了您的代码,我想我已经解决了您的问题。您需要对“object”进行查找和替换,并将其替换为“Block”,或者您需要将从getLast函数返回的对象强制转换为“Block”

更改的示例如下所示:

LinkedList<Block> chain;
这是对区块链类所做更改的一些示例,可能还有其他更改,但我不记得了

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

public void display()
{
    foreach (var item in chain)
    {
        Console.WriteLine(item.getHash());
    }
}
现在,如果您将链接列表中使用对象的所有返回、类型和实例都更改为Block,则将打印哈希列表

这样做的原因是,如果您创建了一个通用“对象”的链接列表,那么在编译时C#不知道链接列表中可能有什么。它可以是块,也可以是香蕉,所以它不知道每个对象可以调用哪些函数和方法。因此,为了让C#知道,我们必须在从列表中获取项目后使用“as Block”对其进行强制转换,或者在您的情况下,只需将链接like中所有值的类型设置为“Block”,因为根据程序的外观,列表中不会有通用条目


希望这能回答你的问题。如果没有,请告诉我。

当您将链指定为

LinkedList<object> chain
这意味着链只能包含Block类型(或Block的子类)的元素


虽然对这些方法的调用没有显示在代码中,但是您需要将
createGenesisBlock()
getLatestBlock()
方法更改为返回Block而不是object,因为不再允许您将任何对象添加到链接列表中,它一定是块。

是的,回答了我的问题非常感谢,我不知道我可以告诉链接列表是块类型的。您的解释非常有用!你们的两个答案真的为我澄清了这一点谢谢你们我不知道我可以告诉链表,它可以阻止我只是假设对象将是我需要使用的非常感谢
LinkedList<object> chain
chain.Add("Hi there!");
chain.Add(new Dictionary<int, decimal>());
chain.Add(new Giraffe());
chain.Add(42);
LinkedList<Block> chain;