Как установить свойство объекта в классе для нового экземпляра другого класса на основе типа этого объекта? - PullRequest
0 голосов
/ 28 февраля 2011

У меня есть следующий класс (не компилируется):

public class Field {
    public string fldName { get; set; }
    public object fldValue { get; set; }
    public Field() { }
    public Field(string name, object value) {
        fldName = name;
        Type type = Type.GetType(value);
        fldValue = Activator.CreateInstance(type);
        if (value == null) fldValue = ""; // forces object to be a string
    }
}

Я пытаюсь заставить это работать с передачей либо строки, либо другого класса, который я создал. Если я установлю:

fldValue = value;

Он только копирует объект по ссылке, а не создает экземпляр нового класса. Я не уверен, нужен ли мне здесь дженерик или нет, но предпочел бы обойтись без него. Я также не уверен, нужно ли мне глубоко копировать объект аргумента в новый объект экземпляра, если этот код работал.

Свойства класса, который я хочу скопировать в fldValue, кроме строки, выглядят так:

 public class DateReminder {
            public DateTime reminderDate {get; set;}
            public bool remindDate { get; set; }
            public int warningTime {get; set;}
            public bool remindWarn { get; set; }
    }

Для всех, кто заинтересован, решается следующим образом:

 public class Field {

        public string fldName { get; set; }
        [XmlElement( typeof(string))]
        [XmlElement(typeof(DateReminder))]
        public object fldValue { get; set; }

        public Field() { }

        public Field(Field inField) {
            this.fldName = inField.fldName;
            if (inField.fldValue.GetType() == typeof(DateReminder)) {
                fldValue = (DateReminder)inField.fldValue;
            }
            else fldValue = inField.fldValue;
        }

        public Field(string name, object value) {
            if (value == null) {
                value = "";
            }
            fldName = name;
            fldValue = value;
        }
    }

и DateReminder имеет свой собственный конструктор копирования.

1 Ответ

0 голосов
/ 28 февраля 2011

Важно понимать, что значение переменной value является ссылкой, а не объектом.Это значение копируется непосредственно в fldValue с помощью оператора

fldValue = value;

Так что да, fldValue будет ссылаться на любой объект, на который value ссылается.

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

Чего в конечном итоге вы пытаетесь достичь, а что не работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...