代码之家  ›  专栏  ›  技术社区  ›  viky

如何从属性获取实例

  •  0
  • viky  · 技术社区  · 14 年前

    在我的应用程序中,我有一个类,它具有如下用户定义类型的属性:

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

    对于一些需要在主程序中执行的操作,我创建了一个a的列表,并在创建mytype对象时将myproperty添加到其中

    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 回复  |  直到 14 年前
        1
  •  1
  •   Jon Skeet    14 年前

    我想你是说你在创造一个 List<A> 你想从一个 A 哪种情况 MyType “拥有”它。不把信息放进去是不可能的 (或有一个完整的实例列表 MyType 并检查它们)。毕竟,有两个例子 MyType 可能也一样 :

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

    哪个 MyType a 逻辑上与?要么两者都没有,真的…

    最干净的方法是 知道哪个 MyType 它与显式关联-然后您可以决定如果您尝试将一个a实例与两个 MyType (它应该抛出异常吗?把这两个都列在清单上?保留新的?)你可能想 MyType.MyProperty 更新传入的值,以保持关联同步。

        2
  •  1
  •   Stremlenye    14 年前

    最简单的答案是:使用字典,而不是列表。但我觉得很难看。 或者放入内部父引用。

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

    Important! Read about MemberwiseClone Function

        3
  •  0
  •   wallismark    14 年前

    你不能这样做的任何原因:

    List<MyType> myList = new List<MyType>();
    
    MyType m1 = new MyType();
    myList.Add(m1);
    

    然后在主程序中,您可以从mytype中获取所有myproperty,并且您可以访问mytype对象的任何信息。

    这个想法有点类似…我经常看到开发人员创建这样的方法

    public void ProcessFoo(int idOfFoo){}
    

    之后,他们需要从foo对象中添加到签名中的其他细节

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

    最好的方法(除非有一些奇怪的限制)是首先传入整个foo对象…

    public void ProcessFoo(Foo foo){}
    

    嗯,好吧,我不愿意在没有更多背景的情况下给任何额外的“建议”。我相信在你所做的背景下,这是有道理的,但对我来说似乎很危险。

    jon的答案与a的一个实例可以分配给mytype的myproperty非常相关,那么您所说的a的实例也可以属于mypropertyx和mypropertyy。

    对不起,Stremlenye但是克隆这个对象的目的是什么?对我来说,创建一个全新的独立实例需要一个非常好的理由……特别是因为克隆除了最简单的对象之外很少能很好地实现(也许有一个很好的理由,我只是从示例中看不到)。