c#覆盖问题

c#覆盖问题,c#,C#,我有一个具有以下属性的基类: public virtual Dictionary<String, int> activity { get; set; } 然后尝试访问字典,如下所示: c.activity["result"] 我收到一个错误,说它不在字典里 派生类位于另一个程序集…dll文件中 有什么想法吗 谢谢。听起来不像class1c=newclass1()与您实例化字典的类的实例相同 要能够使用值访问字典属性,您实例化的类必

我有一个具有以下属性的基类:

public virtual Dictionary<String, int> activity
    {
        get;
        set;

    }
然后尝试访问字典,如下所示:

c.activity["result"]
我收到一个错误,说它不在字典里

派生类位于另一个程序集…dll文件中

有什么想法吗


谢谢。

听起来不像
class1c=newclass1()
与您实例化
字典的类的实例相同


要能够使用值访问
字典
属性,您实例化的类必须是实例化
字典
的类,或者是从它派生的类。

它听起来不像
Class1 c=new Class1()
与您实例化
字典的类的实例相同

Class1 c = new Class2();
c.activity["result"]
要能够使用值访问
字典
属性,您实例化的类必须是实例化
字典
的类,或者是从该字典派生的类

Class1 c = new Class2();
c.activity["result"]
在类2中重写活动属性而不是在类1中重写活动属性是否有效


如果您没有在Class1中声明字典实例,则将属性标记为抽象,那么重写Class2中而不是Class1中的activity属性将有效。如果您这样做,那么只需将值“result”添加到它。清楚地考虑谁拥有Class1和Class2之间的数据。实际上,如果Class1不打算实际分配任何数据,那么它可能需要在这里只是一个接口。

如果您没有在Class1中声明字典实例,那么请标记属性摘要。如果您这样做,那么只需将值“result”添加到它。清楚地考虑谁拥有Class1和Class2之间的数据。实际上,如果Class1不打算实际分配任何数据,那么它可能需要只是一个接口。

您已经创建了Class1的一个实例,如果我正确地解释了这个问题,它就是您的基类(包括类声明会很有帮助)。为了让对象c使用Class2中的字典,需要将其创建为Class2的实例

您的代码将如下所示:

基类:

class Class1
{
    public virtual Dictionary<String, int> activity
    {
        get;
        set;
    }
}

此时,c.activity[“result”]将包含预期的结果。

您已经创建了一个Class1实例,如果我正确解释了这个问题,它是您的基类(包括类声明将非常有用)。为了让对象c使用Class2中的字典,需要将其创建为Class2的实例

您的代码将如下所示:

基类:

class Class1
{
    public virtual Dictionary<String, int> activity
    {
        get;
        set;
    }
}

此时,c.activity[“result”]将包含预期的结果。

Class1是基类还是派生类?Class1是父类还是子类?您的示例没有显示哪个代码与哪个类名匹配。Class1是基类还是派生类?字典在
Class1
中的什么位置初始化(假设是派生类;问题不完全清楚)?@Darren:请编辑问题,以便清楚什么名称指的是什么类,什么代码去哪里?Class1是基类还是派生类?Class1是父类还是子类?您的示例没有显示哪个代码与哪个类名匹配。Class1是基类还是派生类?字典在
Class1
中的什么位置初始化(假设是派生类;问题不完全清楚)?@Darren:请编辑问题,以便清楚什么名称指的是什么类,代码的位置。嗨,我忘了提到,被重写的属性实际上在另一个程序集中…一个dll文件。@Darren程序集不重要,重要的是该属性所属的类。如果您创建了一个基类ClassA,并且有两个继承自它的类ClassB和ClassC,ClassC将看不到在ClassB中被重写的属性。更重要的是,ClassB的两个实例将看不到该属性的相同实例。嗨,我忘了提到,被重写的属性实际上在另一个程序集中…一个dll文件。@Darren程序集不重要,重要的是该属性所属的类。如果您创建了一个基类ClassA,并且有两个继承自它的类ClassB和ClassC,ClassC将看不到在ClassB中被重写的属性。此外,ClassB的两个实例将看不到相同的属性实例。
class Class2
{
    Dictionary<string, int> myActivity = new Dictionary<string, int>()
    {
        {"result", 5},
        {"total", 6}
    };


    public override Dictionary<string, int> activity
    {
        get
        {
            return myActivity;
        }

    }
}
Class1 c = new Class2();