C # Получить имя объекта по экземпляру - PullRequest
1 голос
/ 14 октября 2011

у меня есть:

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

Где-то у меня есть экземпляр obj2, например. Как я могу получить его имя ("obj2") без использования класса A или экземпляра A?

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Вы не можете сделать это.obj2 - это имя свойства класса A. Поэтому, не используя класс A, вы не сможете узнать имена его свойств.

1 голос
/ 14 октября 2011

Единственный способ - отслеживать процесс сборки класса 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 голосов
/ 14 октября 2011

Чтобы сделать это без экземпляра класса 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; }
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...