问题描述
|
目前我有一个这样的班级;
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
我如何更改我的班级以支持这一点?
解决方法
您可以以相同的方式嵌套它...但是,您显然会失去任何数组功能。
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;
}
}
,用var1
,var2
等创建Coc
类,并用它代替double[]
。
注意:您应该使用属性,而不是以这种方式公开字段。
,如果您使用的是.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;
}
}
,为了能够通过变量引用值,您必须重构您的类,以便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,164);
public ValueCollection mar = new ValueCollection(234,342);
}
,使其成为一个枚举:public enum { var1=156,var2=4,var3=8 var4=164}
。我可能对语法有些了解,但这应该是一个开始。
http://msdn.microsoft.com/en-us/library/cc138362.aspx
,能够做自己想做的事,需要事先知道您的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,164 };
DrugInfo mar = new DrugInfo() { 234,342 };
然后您可以访问它,例如::14ѭ或drug.mar.var1
。
,我可能对您的要求不满意,但您可以像这样使用Dictionary
public Dictionary<string,double> coc = new Dictionary<string,double>()
{
{\"var1\",156},{\"var2\",4},{\"var3\",8}
};
然后像这样检索值
double d = drug.coc[\"var1\"]