2012-01-24 2 views
1
public class Constants 
{ 
    public const string test1 = "This is testvalue1;" 
    public const string test2 = "This is testvalue1;" 
    public const string test3 = "This is testvalue1;" 
    public const string test4 = "This is testvalue1;" 
    public const string test5 = "This is testvalue1;" 
} 

можно каким-то образом получить строку констант с использованием var propertyString = Constants.Where(<Propertyname> == test1).ToString()?Выберите константы из списка по имени собственности

+0

Вы должны были бы использовать отражение, но если вам нужно сделать такие вещи, это, вероятно, лучше использовать статический массив или словарь вместо отдельных констант. –

+0

Помогите объяснить, почему лучше использовать статический массив? –

+0

См. Ответ vc 74 ;-) Отражение происходит медленнее и, как мне кажется, вроде бы ненужного взлома в вашем случае. –

ответ

4

Вам нужно будет сделать это через отражение.

string fieldName = "test1"; 
object fieldValue = typeof(Constants).GetField(fieldName, BindingFlags.Static).GetValue(null); 
+0

Большое спасибо! –

+0

Есть ли способ изменить это? Таким образом, я могу найти имя свойства по его значению? –

+0

Уже найден ответ на вопрос выше: typeof .GetFields(). Где (m => (строка) m.GetValue (null) == "test1"). First(); –

0

Уверенный, что это возможно. Следующий фрагмент кода использует отражение для цикла через все константы класса.

internal class Program 
{ 
    public const string ConstExample = "constant value"; 

    private static void Main(string[] args) 
    { 
     FieldInfo[] fieldInfos = typeof(Program).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); 

     var constants = fieldInfos.Where(z => z.IsLiteral && !z.IsInitOnly).ToList(); 
     foreach (var constant in constants) 
     { 
      string constantName = constant.Name; 
      object constantValue = constant.GetValue(null); 
      Console.WriteLine(string.Format("Constante name: {0}, constant value: {1}", constantName, constantValue)); 
     } 

     Console.ReadKey(); 
    } 
} 
2

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

public string GetConstantValue(string key) 
{ 
    return _constants[key]; 
} 

private Dictionary<string, string> Constants = new Dictionary<string, string>() 
{ 
    { "test1", "This is testvalue1;" }, 
    { "test2", "This is testvalue2;" }, 
    { "test3", "This is testvalue3;" }, 
    { "test4", "This is testvalue4;" }, 
    { "test5", "This is testvalue5;" }, 
}; 

, а затем использовать MyClass.GetConstantValue("test1"), чтобы получить значение константы.

2

Это также может работать:

foreach (var prop in typeof(Constants).GetFields()) 
    { 
     string test = prop.GetRawConstantValue().ToString(); 

     if (test == "test1") 
      MessageBox.Show("You got me!"); 
    } 
+1

Невозможно увидеть использование для первой строки. Но да, это работает :) –

1

Вы можете использовать Reflection.

List<string> messages = new List<string>(); 
foreach (FieldInfo field in typeof(Constants).GetFields().Where(f =>   f.Name.StartsWith("test"))) 
{ 
    messages.Add(field.GetRawConstantValue().ToString()); 

} 
0

Для хорошей производительности и удобочитаемости я бы рекомендовал массив и перечисление.

class App 
{ 
    private enum ConstantsEnum: int 
    { 
     DefaultName = 0, 
     DefaultMode = 1, 
     DefaultStatus = 2 
    } 
    private readonly string[] Constants = new string[]{ 
     "MyProgram", 
     "Test", 
     "Enabled" }; 

    private void DoWork() 
    { 
     Console.WriteLine(Constants[ConstantsEnum.DefaultName]); 
    } 
} 

Обратите внимание, что все переменные должны быть типа string. Если вы хотите смешивать и сопоставлять типы данных, тогда вы можете использовать object[] вместо string[], но это было бы более дорогостоящим, а не безопасным по типу.

Если вы просто ищете способ группировки некоторых свойств, то это намного лучше, чем отражение.

1

Для того, чтобы получить это,

var p = Constants.Get("test1");//gives 'This is testvalue1' 

Вы можете сделать это -

public class Constants 
{ 
    public const string test1 = "This is testvalue1"; 
    public const string test2 = "This is testvalue1"; 
    public const string test3 = "This is testvalue1"; 
    public const string test4 = "This is testvalue1"; 
    public const string test5 = "This is testvalue1"; 

    public static string Get(string propertyName) 
    { 
     var value = (string)(typeof(Constants).GetField(propertyName,BindingFlags.Static | BindingFlags.Public).GetValue(null)); 
     return value; 
    } 
} 
Смежные вопросы