如何在C#中实现具有静态对象定义的分部类

时间:2012-01-30 20:41:15

标签: c# static-members partial-classes

//找到解决方案...... 问题实际上是我在创建时填充了一个寄存器数组(构造方法),并且该数组没有实例化。

为了简短起见,我甚至在建设者中设置了一个断点,看看.Net是否处理了第一次机会异常。

再次感谢所有回复者。你真的很有帮助。 :) 再次抱歉我的诺言

我今天学到了什么: - 你永远不知道.net会如何合并你的部分类 - 更了解第一次机会异常

//状态变化2012/01/30 17:00左右 对不起,我缩小了错误的问题。这里解释的问题似乎并不是由提供的代码引起的,因此这个问题不再需要存在。 感谢回复!

//已弃用,已关闭...... W / E

我有一个可以通过各种注册表联系的设备,如0x01,0x02,0x03 ...... 此外,我在一个开发环境中工作,我生产的应用程序面向我们自己的环境中的小型公司。

要将这些注册表转换为对象,我很久以前就选择创建一个私有的构造函数来创建它自己的实例(据我所知,多吨设计模式)。

由于现在有很多注册表,并且类文件变得越来越大,我想将它分成几部分:属性/函数定义和多吨对象。

当我尝试使用此ex时: Register.cs:

namespace DeviceManagement.Register
{
    public partial class Register
    {
       public int id { get; private set; }
       public string foo { get; private set; }
       public string bar { get; private set; }

       protected Register(RegisterEnum id, string foo, string bar)
       {
          this.id = (int)id;
          this.foo = foo;
          this.bar = bar;
       }
    }
}

Register.enum.cs:

namespace DeviceManagement.Register
{
    public partial class Register
    {
       protected enum RegisterEnum
       {
          reg1 = 0x01,
          reg2 = 0x02 //and so on
       };
    }
}

Register.const.cs:

namespace DeviceManagement.Register
{
    public partial class Register
    {
       public static readonly Register reg1 = 
          new Register(RegisterEnum.reg1,"foo1","bar1");
       public static readonly Register reg2 = 
          new Register(RegisterEnum.reg2,"foo2","bar2");
       //there is plenty more
    }
}

我打算像

一样使用它
namespace DeviceManagement
{
   class SomeClassA
   {
       public void doThisOnDevice(Device device)
       {
          device.doSomeStuffOn(Register.Register.reg1, SomeCommonlyUsedStrategy);
       }
   }
}

这是我做过的测试:

namespace DeviceManagement
{
   class SomeClassA
   {
       public void testIfNull()
       {
          if(Register.Register.reg1 == null)
             MessageBox.Show("It is null");
       }
   }
}

compilator,intellisense不会抛出任何错误/警告,但是当我运行我的项目时,Register对象永远不会被实例化。尽管如此,当所有这些代码都在同一个类(非部分)并且显然在同一个文件中时,我没有这个问题。

我有点迷茫,请帮帮我。

2 个答案:

答案 0 :(得分:1)

对于初学者,您不需要将其分解为部分类以将其包含在多个文件中。如果你想将它们组合在一起,那么你可以将它放在不同的子命名空间中,无论如何...

它看起来像命名空间问题,因为您需要使用Register.Register.reg1来访问静态const。

修改

好的,所以从反馈和重新阅读这个问题几次,我感觉当前的设计可能不会完全在同一个类定义中工作。我想你可能会试图强迫某些事情不会发生。

那么,为什么不尝试这样的事情:

namespace DeviceManagement.Register
{
    public class Register
    {
        public RegisterType Type { get; private set; }
        public string Foo { get; private set; }
        public string Bar { get; private set;  }

        public Register(RegisterType type, string foo, string bar)
        {
            Type = type;
            Foo = foo;
            Bar = bar;
        }
    }

    public enum RegisterType
    {
        reg1 = 0x01,
        reg2 = 0x02 //and so on   
    }

    public static class RegisterFactory
    {
        private static readonly Dictionary<RegisterType, Register> _dictionary = new Dictionary<RegisterType, Register>
                                                                     {
                                                                         { RegisterType.reg1, new Register(RegisterType.reg1, "foo", "bar") },
                                                                         { RegisterType.reg2, new Register(RegisterType.reg2, "foo2", "bar2") }
                                                                     };

        public static Register GetRegister(RegisterType type)
        {
            return _dictionary[type];
        }
    }
}

并使用寄存器:

public class SomeClassA
{
    public void DoThisOnDevice(Device device)
    {
        device.DoSomeStuffOn(RegisterFactory.GetRegister(RegisterType.reg1), SomeCommonlyUsedStrategy);
    }
}

然后,您可以更进一步,从配置文件中加载注册表详细信息,该文件在启动应用程序时对其进行解析,然后您可以从UI等处选择要处理的注册表类型。

希望我没有错误的结束。

答案 1 :(得分:0)

我复制粘贴你的代码,它对我来说很好。

我的建议是使用Visual Studio的Class View。在这里,您可以轻松查看是否所有部分类都在同一名称空间中定义,并且具有完全相同的类名。如果没有,将出现太多名称空间或类。