как я могу получить экземпляр от собственности - PullRequest
0 голосов
/ 24 марта 2010

В моем приложении у меня есть класс, который имеет свойства пользовательских типов, таких как:

class MyType
{
    public A MyProperty
    {
        get;
        set;
    }
}
class A
{
    .....some methods and proeprties
}

для некоторых операций, которые мне нужно выполнить из моей основной программы, я создал список A и добавляю в него MyProperty при создании объекта MyType

List<A> myList = new List<A>();

MyType m1 = new MyType();
myList.Add(m1.MyProperty);

MyType m2 = new MyType();
myList.Add(m2.MyProperty);

......more instances

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

Ответы [ 3 ]

1 голос
/ 24 марта 2010

Самый простой ответ: используйте словарь, а не список. Но я думаю, что это некрасиво. Или вставьте внутреннюю родительскую ссылку.

class A:ICloneable
{
    internal MyClass _parent;

    public MyClass Parent
    {
        get
        {
            return this._parent;
        }
    }

#region ICloneable Members

    public object Clone()
    {
        return this.MemberwiseClone();
    }

#endregion

    .....some methods and proeprties
}

class MyType
{
    private A _myProperty;

    public A MyProperty
    {
        get
        {
                return this._myProperty;
        }
        set
        {
                this._myProperty = a.Clone();
                this._myProperty._parent = this;
        }
    }
}

Внимание! Прочитайте о функции MemberwiseClone

1 голос
/ 24 марта 2010

Я подозреваю, что вы имеете в виду, что вы создаете List<A>, и вы хотите иметь возможность узнать из экземпляра A, какой экземпляр MyType "владеет" им. Нет способа сделать это, не помещая информацию в A (или не имея исчерпывающего списка экземпляров MyType и проверяя их). В конце концов, два экземпляра MyType могут иметь одинаковые A:

MyType first = new MyType();
MyType second = new MyType();
A a = new A();
first.MyProperty = a;
second.MyProperty = a;

С чем MyType логически связана a? И то и другое, правда ...

Самый чистый подход - сообщить A о том, с каким MyType он связан явно, - тогда вы можете решить, что произойдет, если вы попытаетесь связать один экземпляр A с двумя экземплярами MyType (если выбросить исключение? Сохранить оба как список? Сохранить более новое?) Возможно, вы захотите MyType.MyProperty обновить переданное значение, чтобы синхронизировать связь.

0 голосов
/ 25 марта 2010

Любая причина, почему вы не могли сделать это вместо: -

List<MyType> myList = new List<MyType>();

MyType m1 = new MyType();
myList.Add(m1);

И тогда в основной программе вы можете получить все MyProperty из MyType, плюс у вас будет доступ к любой информации об объекте MyType, которая вам может понадобиться.

Идея немного похожа на это ... Я часто вижу, как разработчики создают такой метод

public void ProcessFoo(int idOfFoo){}

затем им понадобятся другие детали из объекта Foo, которые они добавляют к подписи

public void ProcessFoo(int idOfFoo, string name){}

Лучший подход (если не существует каких-то странных ограничений) - это просто передать весь объект Foo в первую очередь ...

public void ProcessFoo(Foo foo){}

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

Ответ Джона очень важен, поскольку один экземпляр A может быть назначен MyProperty MyType, тогда вы говорите, что экземпляр A также может принадлежать MyPropertyX и MyPropertyY.

Извините, стремленые, но какова цель клонирования объекта? Для меня должна быть очень веская причина для создания совершенно нового отдельного экземпляра ... тем более, что клонирование редко реализуется хорошо для всех, кроме самых простых объектов (возможно, есть веская причина, я просто не вижу этого из примера).

...