Передача информации в конструктор без использования параметра в C # - PullRequest
1 голос
/ 30 июня 2009

Я немного загнал себя в угол. Вот упрощенная версия того, что у меня есть (в C #):

class OuterClass
{
    private class BadClass
    {
        private int Data;

        public BadClass()
        {
            Data = 0;

            ...
        }
    }

    T Build<T>(Object Input)
    {
        T x = new T();
        ...
        return x;
    }

    void SomeMethod()
    {
        BadClass a = Build<BadClass>(anObject);
        ...
    }
    ...
}

Проблема, с которой я столкнулся, заключается в том, что теперь я должен изменить начальное значение Data в зависимости от экземпляра OuterClass, который создает экземпляр BadClass. Обычно я просто использовал бы конструктор BadClass, который принимает параметр:

public BadClass(int Data)
{
    this.Data = Data;
    ...
}

Но я использую BadClass в нескольких универсальных типах, поэтому у меня должен быть конструктор BadClass без параметров. Жаль, что я не могу сделать что-то вроде этого:

Build<BadClass(5)>(anObject);

Итак, как я могу предоставить информацию времени выполнения конструктора, когда я не могу передать параметры в конструктор?
Можно ли создать экземпляр времени выполнения типа BadClass, предоставить ему необходимую информацию, а затем использовать ее в моих универсальных типах?

РЕДАКТИРОВАТЬ: Я использовал List в качестве примера универсального типа, но это не полностью выразить глубину моей дилеммы ...
Я могу создать тест в Build для вызова функции инициализации, если я работаю с BadClass, но это очень глупо. Я надеюсь найти немного менее уродливый способ сделать это.

Ответы [ 4 ]

6 голосов
/ 30 июня 2009

Когда вы создаете List<BadClass>, вы не создаете никаких экземпляров BadClass. Продолжайте и создайте этот путь, но когда вы создаете экземпляр BadClass для добавления к нему, тогда вы вызываете свой параметризованный конструктор:

List<BadClass> a = new List<BadClass>();
a.Add(new BadClass(1));
a.Add(new BadClass(2));

Кстати, конструкция экземпляра BadClass зависит от того, какой объект создает OuterClass, это немного запах кода. Чего ты пытаешься достичь?

2 голосов
/ 30 июня 2009

Если вам нужно иметь несколько типов BadClass, которые являются вариациями обобщений, вы можете сделать это, изменив дерево наследования:

class OuterClass {
    private class BadClassBase {
        // whatever BadClass does 
    }
    private class BadClass : BadClassBase {
        public BadClass(T item) {
            ...
        }
    }
}

Не уверен, что это то, что вы собираетесь, но вы можете создать свой список .

1 голос
/ 30 июня 2009

Как насчет того, чтобы сделать что-то подобное?

using System.Collections.Generic;

class OuterClass
{
    private class BadClass
    {
        private int _data;

        public BadClass()
        {
            _data = 0;

        }

        public int Data
        {
          get
          {
             return _data;
          }
          set
          {
             _data = value;
          }
        }

    }

    void SomeMethod()
    {
        List<BadClass> a = new List<BadClass>() 
        { 
          new BadClass() { Data = 7 }, 
          new BadClass() { Data = 9 } 
        };
    }
}
1 голос
/ 30 июня 2009

Можете ли вы дать BadClass метод инициализации?

private class BadClass
{
    private int Data;

    public BadClass()
    {
        Data = 0;
        ...
    }

    public void Init(int dataValue)
    {
        Data = dataValue;
    }
}

Тогда, когда вы создаете его, это:

BadClass myInst = new BadClass(); // void constructor, as you require.
myInst.Init(5);  // Set the value to 5.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...