2012-01-30 4 views
1

// Найден решение ... Проблема была в том, что у меня есть массив регистра, заполненный при создании (метод contructor), и этот массив не был инстанцирован ,Как реализовать частичный класс со статическим определением объекта в C#

Чтобы сделать это короче, я тоже был noob, чтобы даже поставить точку останова в конструкторе, чтобы увидеть, обработал ли .NET.

Еще раз спасибо за ответы. Вы были очень полезны. :) снова Извините за мой noobness

Что я узнал сегодня: Ты никогда не знаешь, как .net сольются ваш частичный класс -be более осведомлены о первых случайных исключениях

// Изменение состояния 2012/01/30 17:00 или около того Извините, я сузил неправильную проблему. Проблема, объясняемая здесь, по-видимому, не вызвана кодом, поэтому этот вопрос больше не требуется. Благодаря ответчикам!

// РЕКОМЕНДУЕТСЯ, ЗАКРЫТО ... W/E

У меня есть устройство, которое можно связаться различным реестром таких 0x01, 0x02, 0x03 ... Кроме того, я работаю в среде разработки и тому приложение, которое я производю, ориентировано для нашей собственной среды в небольшой конфигурации.

Чтобы превратить этот реестр в объект, который я выбрал, давным-давно, чтобы создать класс, у которого есть собственный конструктор, чтобы создать собственный и единственный экземпляр (как я понимаю, многотонный шаблон дизайна).

Поскольку сейчас существует много реестра, и файл класса становится огромным, я хочу разбить его на части: определения свойств/функций и многотонные объекты.

Когда я пытаюсь использовать этот пример: 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 не бросает любую ошибку/предупреждение, но, когда я бегу мой проект, объекты Регистрация никогда не инстанциирован. Более того, у меня нет этой проблемы, когда весь этот код находится в одном классе (не частичном) и, очевидно, в том же файле.

Я как бы потерялся, пожалуйста, помогите мне.

+0

Когда вы говорите, что объекты Register никогда не были instanciated_, означает ли это, что 'Register.reg1' является' null' внутри 'doThisOnDevice (...)'? – Nailuj

+0

Кроме ошибок компиляции, в вашем коде отсутствует ошибка. Я думаю, что ваш код здесь не отражает реальный код. –

+0

@Nailuj, Да, это null, и если я установил точку останова на любой строке объявления/инициализации. Он никогда не останавливается на достигнутом. Register.Register.reg1 имеет значение null, когда я пытаюсь вызвать подобное в doThisOnDevice (...) –

ответ

1

Для начала вам не нужно разбивать его на частичный класс, чтобы иметь его в нескольких файлах. Если вы хотите объединить его вместе, вы можете поместить его в другое пространство имен в разных файлах, так или иначе ...

Это похоже на проблему с пространством имен, так как вам нужно иметь Register.Register.reg1 для доступа к статическому const.

EDIT

Итак, с обратной связью и перечитывая постановка вопроса еще несколько раз, я чувствую, что нынешний дизайн, вероятно, не будет достаточно работы все в том же определении класса. Я думаю, вы, может быть, пытаетесь что-то вникать в что-то, что не пойдет.

Итак, почему бы не попробовать что-то вроде этого:

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

Вы могли бы взять его на шаг дальше и нагрузки в деталях реестра из файла конфигурации который анализирует его при запуске вашего приложения, вы можете выбрать тип реестра для работы с вашим пользовательским интерфейсом и т. д.

Надеюсь, у меня нет неправильного конца sti ск.

+0

Спасибо за ваш быстрый ответ. Я отредактировал мой вопрос, чтобы исправить эту ошибку. –

+0

На самом деле у меня уже была эта функция. Но меня попросили жестко закодировать их. Так как это приложение может быть отправлено клиентам, даже если оно не предназначено, и моему боссу не понравился тот факт, что если пользователь не является администратором, чтение и запись файла может быть сложнее. и мы не хотим заниматься технической поддержкой: как пользоваться компьютером. В любом случае, спасибо за ответ, вы поняли, что это сработает. Наверное, мне не нравится идея итерации через словарь каждый раз, когда я хочу получить доступ к регистру. –

+0

Вы не будете итерировать через словарь каждый раз, его поиск ключевого значения. Словарь будет инициализирован, когда приложение сначала попытается получить доступ к словарю, оно будет там в течение всего времени работы приложения. Я понимаю, что не хочу, чтобы детали находились в файле конфигурации :-) – WestDiscGolf

0

Скопируйте код на свой код, и он отлично подходит для меня.

Мой совет заключается в использовании Class View Visual Studio. Здесь вы можете легко увидеть, определены ли все частичные классы в одном пространстве имен и с тем же именем класса. Если нет, появится слишком много пространств имен или классов.

+0

Да, я понял, что мой пример кода работает. Я пытаюсь понять, почему моя копия моего кода преобразуется в образец, а не оригинал. Спасибо за ваш ответ –

Смежные вопросы