c#方法返回值的类内部

时间:2011-05-24 20:49:15

标签: 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

我怎样才能改变我的班级来支持这个?

7 个答案:

答案 0 :(得分:2)

使用Cocvar1等创建var2课程,并使用该课程代替double[]

注意:您应该使用属性而不是以这种方式公开字段。

答案 1 :(得分:1)

您可以以相同的方式嵌套它...但是,您显然会失去任何阵列功能。

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;
    }
}

答案 2 :(得分:1)

如果您使用.Net 4,并且不介意将“药物”类声明为动态,则可以继承“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;
    }
}

答案 3 :(得分:0)

为了能够通过变量引用您的值,您必须重构您的类,以便 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);
}

答案 4 :(得分:0)

将其设为枚举:public enum { var1=156, var2=4, var3=8 var4=164}。我可能会对语法有所了解,但它应该是一个开始。

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

答案 5 :(得分:0)

能够做你想做的事情,你需要事先知道你的coc集合中有多少双打(数组,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.var1drug.mar.var1

答案 6 :(得分:0)

我可能会关注你的问题,但你可以使用像这样的词典

public Dictionary<string, double> coc = new Dictionary<string, double>()
        {
        {"var1", 156}, {"var2", 4}, {"var3", 8}
        };

并检索像这样的值

double d = drug.coc["var1"]