Пусть у меня есть такой класс в языке С #:Есть ли способ создать некоторые коды, которые компилятор будет генерировать еще один код, как показано ниже?
public class ABC {
public int var_1;
public int var_2;
public int var_3;
//... until 100
public int var_100;
public int GetData_WithBasicIfElse (int id) {
if(id == 1)
return var_1;
else if(id == 2)
return var_2;
else //and so on until
else if(id == 100)
return var_100;
}
public int GetData_WithReflection(int id){
string key = "var_" + id.ToString();
FieldInfo info = GetType().GetField (key);
return info != null ? (int)info.GetValue (this) : 0;
}
public int GetData_WithSpecialCode(int id){
//put the simple codes here, then compilers compile it, it will generate code like the method GetData_WithBasicIfElse
}
}
На самом деле в большинстве случаев, я могу использовать массив для хранения var_n переменного, но я просто любопытен, если есть другой способ. Я не хочу использовать GetData_WithBasicIfElse
(не изящно), но мне интересно, есть ли другое решение помимо использования отражения.
То, что я имею в виду с GetData_WithSpecialCode
, содержит специальный код, который будет преобразован компилятором (когда время компиляции, где будет бинарный файл), в некоторый шаблон, например GetData_WithBasicIfElse
.
ОБНОВЛЕНО Эта методика под названием шаблона метапрограммирование, как вы можете увидеть здесь: http://en.wikipedia.org/wiki/Template_metaprogramming, в исходном коде факториала.
Что не так с отражением? –
Если у вас есть 100 идентичных переменных (с точки зрения типа), и вы хотите получить к ним доступ по номеру индекса, мне остается недоумевать, почему вы не просто используете массив. –
@ L.B: нет ничего плохого в отражении, мне просто любопытно, кажется, что есть код в c, который использует свой компилятор для генерации кода во время компиляции. Удивительно, если C# тоже имеет эту технику. –