2011-10-14 39 views
1

获取对象的名字,我有:C#通过实例

class A 
{ 
public object obj1 {get;set;}  
public object obj2 {get;set;}  
public object obj3 {get;set;}  
} 

带我去OBJ2,例如实例。 我如何得到它的名称(“obj2”)而不使用类A或实例A?

+0

你是什么意思“某处我有obj2的实例”?你能显示一些代码吗? –

+2

你的名字是什么意思?假设obj1,2和3都是同一个对象名字是什么?它是“obj1”还是“obj3”?您可以使用反射来获取其值等于某个对象的任何字段的字段名称。但这不是它的名字,也不是唯一的。这是你想要的吗? –

+0

例如我调用另一个类的方法并发送obj2作为参数。 obj1,obj2,obj3一个类的不同实例 – Famos

回答

2

你不能这样做。 obj2是类A的属性的名称。因此,如果不使用类A,则无法知道其属性名称。

+0

好的。我如何做到这一点,如果我有A – Famos

+0

@Famos,你可以使用反射来获得A的属性列表。但我不太确定你想要在这里完成什么。 –

+0

我使用PostSharp观察变化,我需要知道名称对象什么包含更改值 – Famos

0

要做到这一点没有A级的情况下,你必须修改你的属性类型:

class A 
{ 
    private B obj1, obj2; 

    public B Obj1 
    { 
    get { return obj1; } 
    set 
    { 
     if (value != null && value.Owner != null) 
     throw new ArgumentException(); 
     if (obj1 != null) 
     obj1.Owner = null; 
     obj1 = value; 
     obj1.Owner = "Obj1"; 
    } 
    } 
    public B Obj2 
    { 
    get { return obj2; } 
    set 
    { 
     if (value != null && value.Owner != null) 
     throw new ArgumentException(); 
     if (obj2 != null) 
     obj2.Owner = null; 
     obj2 = value; 
     obj2.Owner = "Obj2"; 
    } 
    } 
} 

class B 
{ 
    public string Owner { get; internal set; } 
    // ... 
} 
+0

这是很难的方式:) – Famos

+0

如果您想避免硬编码“Obj1”,您可以尝试MethodInfo.GetCurrentMethod()。Name – Guillaume

1

唯一的办法就是跟踪A级的构建过程,例如:

public class Container 
{ 
    Dictionary<string, object> _objectContainer; 

    public Container() 
    { 
     _objectContainer = new Dictionary<string, object>(); 
    } 

    public void SetByName(string name, object obj) 
    { 
     if(!_objectContainer.ContainsKey(name)) 
     { 
      _objectContainer.Add(name, obj); 
     } 
     else 
     { 
      _objectContainer[name] = obj; 
     } 
    } 

    public object GetByName(string name) 
    { 
     return _objectContainer[name]; 
    } 
} 

public class ABuilder 
{ 
    public static A Build(Container container) 
    { 
     var a = new A(); 

     var obj1 = new object(); 
     var obj2 = new object(); 
     var obj3 = new object(); 

     container.SetByName("obj1", obj1); 
     container.SetByName("obj2", obj2); 
     container.SetByName("obj3", obj3); 

     a.Obj1 = obj1; 
     a.Obj2 = obj2; 
     a.Obj3 = obj3; 

     return a; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new Container(); 

     var obj = ABuilder.Build(container); 

     var obj1 = container.GetByName("obj1"); 
    } 
} 
+0

我想起它,如果简单的方式不存在 – Famos

+0

好的,但你的问题是“某处我有obj2的实例,例如我如何得到它的名字(”obj2“)而不使用类A或实例A?没有关于简单的方法...我的解决方案的作品,这是你的问题的答案。 – ADIMO