метод c # внутри класса, который возвращает значения

#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} . Возможно, я немного ошибаюсь в синтаксисе, но это должно быть началом.

http://msdn.microsoft.com/en-us/library/cc138362.aspx

Ответ №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"]