#c#
#c#
Вопрос:
в настоящее время у меня есть класс, подобный этому;
public static class drug
{
public const double[] coc = new double[] { 156, 4, 8, 164 };
public const double[] mar = new double[] { 234, 64, 34, 342 };
}
я ссылаюсь на него следующим образом:
double one = drug.coc[0];
однако я хотел бы ссылаться на него следующим образом
double one = drug.coc.var1
как я могу изменить свой класс, чтобы поддерживать это?
Комментарии:
1. вы имеете в виду drug.coc[var1] == drug.coc.var1 ??
Ответ №1:
Создайте Coc
класс с помощью var1
, var2
и т.д. И используйте это вместо double[]
.
Примечание: Вы должны использовать свойства вместо того, чтобы предоставлять поля таким образом.
Ответ №2:
Вы могли бы вложить его таким же образом… однако вы, очевидно, потеряете любую функциональность массива.
public static class drug
{
public static class coc
{
public const double var1 = 156;
public const double var2 = 4;
public const double var3 = 8;
public const double var4 = 164;
}
public static class mar
{
public const double var1 = 234;
public const double var2 = 64;
public const double var3 = 34;
public const double var4 = 342;
}
}
Ответ №3:
Если вы используете .Net 4 и не возражаете против объявления вашего класса «drug» как динамического, вы можете наследовать от «DynamicObject» и перегрузить метод TryGetMember для преобразования имени входящего метода в допустимый индекс в вашем массиве.
ДЕЙСТВИТЕЛЬНО быстрый и грязный, и не совсем то, что вы хотели, и у меня нет времени его настраивать, но это работает.
void Main()
{
dynamic d = new drug();
double v1 = d.mar0; //234
double v2 = d.mar1; //64
double v3 = d.mar2; //34
double v4 = d.mar3; //342
}
public class drug : DynamicObject
{
private double[] coc = new double[] { 156, 4, 8, 164 };
private double[] mar = new double[] { 234, 64, 34, 342 };
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name.ToLower();
if(name.StartsWith("coc"))
{
result = coc[int.Parse(name.Replace("coc",""))];
return true;
}
if(name.StartsWith("mar"))
{
result = mar[int.Parse(name.Replace("mar",""))];
return true;
}
result = -1;
return false;
}
}
Ответ №4:
Чтобы иметь возможность ссылаться на ваши значения через переменную, вам пришлось бы реорганизовать свой класс так, чтобы переменная cac была другим классом
public class ValueCollection
{
public ValueCollection(double var1, double var2, double var3, double var4)
{
Var1 = var1;
Var2 = var2;
Var3 = var3;
Var4 = var4;
}
public double Var1 { get; private set; }
public double Var2 { get; private set; }
public double Var3 { get; private set; }
public double Var3 { get; private set; }
}
Затем вы обновили бы свой исходный класс:
public static class drug
{
public ValueCollection coc = new ValueCollection(156,4,8,164);
public ValueCollection mar = new ValueCollection(234,64,34,342);
}
Ответ №5:
Сделайте это перечислением: public enum { var1=156, var2=4, var3=8 var4=164}
. Возможно, я немного ошибаюсь в синтаксисе, но это должно быть началом.
Ответ №6:
Для того, чтобы иметь возможность делать то, что вы хотите, потребуется, чтобы вы заранее точно знали, сколько двойников будет в вашей коллекции coc (array, IEnumerable, что угодно). Предполагая, что вы это знаете, вам все равно понадобится свойство, такое, чтобы coc сам стал классом:
public class DrugInfo
{
public double var1 {get;set;}
public double var2 {get;set;}
public double var3 {get;set;}
public double var4 {get;set;}
}
Тогда ваш новый код будет выглядеть следующим образом:
DrugInfo coc = new DrugInfo() { 156, 4, 8, 164 };
DrugInfo mar = new DrugInfo() { 234, 64, 34, 342 };
К которому вы могли бы затем получить доступ следующим образом: drug.coc.var1
или drug.mar.var1
.
Ответ №7:
Возможно, я не понимаю, о чем вы спрашиваете, но вы могли бы использовать словарь следующим образом
public Dictionary<string, double> coc = new Dictionary<string, double>()
{
{"var1", 156}, {"var2", 4}, {"var3", 8}
};
И извлекает значения следующим образом
double d = drug.coc["var1"]