2015-07-10 3 views
1

создать список первойКак получить имя списка

List<String> dummy1 = new List<String>(); 
List<String> dummy2 = new List<String>(); 
List<String> dummy3 = new List<String>(); 
List<String> dummy4 = new List<String>(); 

Перед тем, как добавить список в словарь

Dictionary<int, List<String>> _d = new Dictionary<int, List<String>>() 
{ 
    {1, dummy1}, 
    {2, dummy2}, 
    {3, dummy3}, 
    {4, dummy4}, 
}; 

, то я хочу, чтобы иметь имя списка Зацикливания ключ

foreach (var key in _d.Keys) 
{ 
    MessageBox.Show(_d[key].GetType().Name); 
} 

но выход list 1, я хочу, чтобы получить

dummy1 
dummy2 
dummy3 
dummy4 
+2

Короче; вы не можете. Не без использования какого-то действительно фанкового синтаксиса для захвата переменных. – Rob

+0

Интересно, может ли новое выражение «nameof» в предстоящем C# 6.0 сделать это, если деревья выражений не могут. .. Может быть, это из-за словаря, но может быть, там какая-то магия? –

+0

@JasonW Я очень сомневаюсь в этом. Как я понимаю, nameof() выполняется во время компиляции и просто заменяет вызов строкой. Например, 'var prop = nameof (dummy1)' компилируется в 'var prop =" dummy1 "'. Хотя я мог ошибаться. – Rob

ответ

1

Просто создайте собственный класс, который наследуется от List<string> и имеет свойство Name.

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     MyList dummy1 = new MyList("dummy1"); 
     MyList dummy2 = new MyList("dummy2"); 
     MyList dummy3 = new MyList("dummy3"); 
     MyList dummy4 = new MyList("dummy4"); 

     Dictionary<int, MyList> _d = new Dictionary<int, MyList>() 
     { 
      {1, dummy1}, 
      {2, dummy2}, 
      {3, dummy3}, 
      {4, dummy4}, 
     }; 

     foreach (var key in _d.Keys) 
     { 
      Console.WriteLine(_d[key].Name); 
     } 
    } 
} 

public class MyList : List<String> 
{ 
    private string name; 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
    } 

    public MyList(string name) 
    { 
     this.name = name; 
    } 
} 

Результаты:

dummy1 
dummy2 
dummy3 
dummy4 

Demo

+0

за этот код –

+0

Я уже применил этот код и отлично работает для меня –

2

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

+1

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

+0

@JasonW: Правильно! Обновлен ответ. – CharithJ

0

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

Dictionary<int, List<String>> 

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

Dictionary<string, List<String>> 

Если вы хотите, чтобы затем получите номер int, соответствующий списку, вы можете использовать обычный цикл for и посмотреть, какое значение находится в этом месте, скажем i = 1.

2

Как я уже говорил, вы можете сделать это только с действительно фанковым синтаксисом. Вот пример того, что я имею в виду

void Main() 
{ 
    List<String> dummy1 = new List<String>(); 
    List<String> dummy2 = new List<String>(); 
    List<String> dummy3 = new List<String>(); 
    List<String> dummy4 = new List<String>(); 

    var _d = new Dictionary<int, Expression<Func<List<String>>>>() 
    { 
     {1,() => dummy1}, 
     {2,() => dummy2}, 
     {3,() => dummy3}, 
     {4,() => dummy4}, 
    }; 
    foreach(var kvp in _d) 
    { 
     MessageBox.Show(kvp.Value.nameof()); 
    } 
} 

// Define other methods and classes here 
public static class TestExtension 
{ 
    public static String nameof<T>(this Expression<Func<T>> accessor) 
    { 
     return nameof(accessor.Body); 
    } 

    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor) 
    { 
     return nameof(propertyAccessor.Body); 
    } 

    private static String nameof(Expression expression) 
    { 
     if (expression.NodeType == ExpressionType.MemberAccess) 
     { 
      var memberExpression = expression as MemberExpression; 
      if (memberExpression == null) 
       return null; 
      return memberExpression.Member.Name; 
     } 
     return null; 
    } 
} 

Основной проблемой является то, что вам нужно словарь, чтобы хранить выражение, а не список

Во-вторых, на самом деле получить доступ к списку, что вам нужно сделать это:

var list = _d[1].Compile()(); 

И, наконец, если dummy1 когда-либо получает переназначены, вы потеряете ссылку на список, вы ожидали.

Короче говоря, очень маловероятно, что вам нужно это сделать. Редко, что имена переменных в коде должны влиять на поведение.

+0

за этот код ... –