繁体   English   中英

如何在C#中使用静态对象定义实现局部类

[英]How to implement a partial class with static object definition in C#

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

简而言之,我太笨拙了,甚至没有在构造函数中放置一个断点,以查看.Net是否处理了第一次机会异常。

再次感谢所有回复者。 您真的很有帮助。 :)再次抱歉,我的笨蛋

我今天学到了什么:-您永远都不知道.net将如何合并您的部分课程-更加了解首次机会异常

// STATE CHANGE 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");
       }
   }
}

编译器intellisense不会引发任何错误/警告,但是,当我运行我的项目时,永远不会实例化Register对象。 好的,当所有这些代码都在同一个类中(而不是部分)并且显然在同一个文件中时,我没有这个问题。

我有点迷路,请帮助我。

对于初学者,您无需将其分解为局部类即可将其包含在多个文件中。 如果您想将其合并在一起,则可以将其放在单独文件中的其他子命名空间中,无论如何...

它看起来像一个名称空间问题,因为您需要具有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等中选择要处理的注册表类型。

希望我没有错误的结局。

我复制粘贴了您的代码,对我来说很好用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM