C#中如何通过一个属性值来获取变量名 我有一个属性值,然后我想在一个数组中通过这个属性值找到这个变量在数组中的位置,即属性值为该值的变量名,我希望能像数组序号一样的得到,而不是去遍历数组进行匹配得到,不知道是不是有办法办到,还望各位不吝赐教,小弟先在此谢过,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /// <summary> /// 设置对象属性的值 /// </summary> /// <param name= "obj "> 对象 </param> /// <param name= "name "> 属性名称 </param> /// <param name= "value "> object值 </param> protected void SetPropertyInfo(object obj, string name,object value) { Type t = obj.GetType(); PropertyInfo pInfo = t.GetProperty(name); Response.Write( "pInfo " + pInfo.GetType()); Response.Write( " <br> "); Response.Write( "pInfo " + t.GetType()); Response.Write( " <br> "); Response.Write( "value " + value.GetType()); Response.Write( " <br> "); Response.Write( " <br> "); pInfo.SetValue(obj, value, null); } 转自:http://topic.csdn.net/u/20071114/22/eb8129c3-6f28-4a9a-a12e-5bf34fbf1aac.html?1083852357 代码如下,写了不好,见笑了。 /// <summary> /// 公式预处理 /// </summary> /// <param name="formula">公式</param> /// <param name="name">名称</param> /// <param name="value">对应值</param> /// <returns>公式计算结果</returns> private static decimal Regular(string formula, string[] name, decimal[] value) { for (int i = 0; i < name.Length; i++) { formula = formula.Replace(name[i], value[i].ToString()); } char[] chs = formula.ToCharArray(); string[] strs=new string[chs.Length]; for(int i=0;i<chs.Length;i++) { strs[i] = chs[i].ToString(); } Stack Digital = new Stack();//存储数字 Stack Operator = new Stack();//存储运算符 string operaters = "+-*/()%"; foreach (string str in strs) { if (str.Equals(string.Empty)) continue;//如果为空继续 if (operaters.IndexOf(str) != -1)//是操作符 { if (str.Equals("(")) { Operator.Push(str);//进栈 } else { Calculat(Digital, Operator, str); } } else//不是操作符 { Digital.Push(decimal.Parse(str)); } } if (Operator.Count != 0) Calculat(Digital, Operator, ")");//计算栈中剩余部分 return (decimal)Digital.Pop(); } /// <summary> /// 计算 /// </summary> /// <param name="str">操作符</param> private static void Calculat(Stack Digital, Stack Operator, string str) { if (Operator.Count == 0) { Operator.Push(str); return;//已经没有运算符了 } string prev = (string)Operator.Peek(); if (prev == null || prev.Equals(string.Empty)) return;//元素不存在 if (prev.Equals("(")) { if (str.Equals(")")) { Operator.Pop();//移除操作符 return; } else { Operator.Push(str);//进栈 } } else if (compareOperater(str) <= compareOperater(prev))//第一个操作符等级小于等于第二个,则进行运算 { Operator.Pop();//移除操作符 switch (prev) { case "+"://进行加操作 { decimal num1 = (decimal)Digital.Pop();//返回第一个元素 decimal num2 = (decimal)Digital.Pop();//返回第二个元素 Digital.Push(num2 + num1); } break; case "-": { decimal num1 = (decimal)Digital.Pop();//返回第一个元素 decimal num2 = (decimal)Digital.Pop();//返回第二个元素 Digital.Push(num2 - num1); } break; case "*": { decimal num1 = (decimal)Digital.Pop();//返回第一个元素 decimal num2 = (decimal)Digital.Pop();//返回第二个元素 Digital.Push(num2 * num1); } break; case "/": { decimal num1 = (decimal)Digital.Pop();//返回第一个元素 decimal num2 = (decimal)Digital.Pop();//返回第二个元素 Digital.Push(num2 / num1); } break; case "%": { decimal num1 = (decimal)Digital.Pop();//返回第一个元素 Digital.Push(num1 / 100); } break; } Calculat(Digital, Operator, str);//继续比较 } else { Operator.Push(str);//进栈 } } /// <summary> /// 运算符级别 /// </summary> /// <param name="operater">操作符</param> /// <returns></returns> private static int compareOperater(string operater) { string str3 = "("; string str2 = "*/%"; string str1 = "+-"; string str0 = ")"; if (str0.IndexOf(operater) != -1) return 0;//零级运算符 if (str1.IndexOf(operater) != -1) return 1;//一级运算符 if (str2.IndexOf(operater) != -1) return 2;//二级运算符 if (str3.IndexOf(operater) != -1) return 3;//三级运算符 return -1; } static void Main(string[] args) { //公式 string formula = "C*2-B+L"; //这边上下关系对应,送C=3之类的也可以,做个转换 string[] name = new string[] { "C", "B", "L" }; decimal[] value = new decimal[]{ 3, 5, 3}; //完成表达式计算 decimal Y = Regular(formula, name, value); for(int i=0;i<name.Length;i++) Console.WriteLine("{0}={1}", name[i], value[i]); Console.WriteLine("Y={0}={1}",formula,Y); Console.ReadLine(); } 关于WPF中DrawingContext的疑问 URL地址输入<script>报错? 下面这条语句的速度还能提高吗 window.alert 问题 正则表达式 最小 匹配 一个有关.NET编程的问题 请问datagrid的每行数据怎么竖着排列? 两个线程建立两个Win窗口,怎么互相控制控件的属性啊? vs2008 程序关闭无提示 安装vs.net2003 后c#工具在什么地方? 怎么在C#windows里面加入3D模型 c#串口接收总是接收不全怎么办?????????????
/// <summary>
/// 设置对象属性的值
/// </summary>
/// <param name= "obj "> 对象 </param>
/// <param name= "name "> 属性名称 </param>
/// <param name= "value "> object值 </param>
protected void SetPropertyInfo(object obj, string name,object value)
{
Type t = obj.GetType();
PropertyInfo pInfo = t.GetProperty(name);
Response.Write( "pInfo " + pInfo.GetType());
Response.Write( " <br> ");
Response.Write( "pInfo " + t.GetType());
Response.Write( " <br> ");
Response.Write( "value " + value.GetType());
Response.Write( " <br> ");
Response.Write( " <br> "); pInfo.SetValue(obj, value, null);
}
转自:http://topic.csdn.net/u/20071114/22/eb8129c3-6f28-4a9a-a12e-5bf34fbf1aac.html?1083852357
/// 公式预处理
/// </summary>
/// <param name="formula">公式</param>
/// <param name="name">名称</param>
/// <param name="value">对应值</param>
/// <returns>公式计算结果</returns>
private static decimal Regular(string formula, string[] name, decimal[] value)
{
for (int i = 0; i < name.Length; i++)
{
formula = formula.Replace(name[i], value[i].ToString());
} char[] chs = formula.ToCharArray();
string[] strs=new string[chs.Length];
for(int i=0;i<chs.Length;i++)
{
strs[i] = chs[i].ToString();
}
Stack Digital = new Stack();//存储数字
Stack Operator = new Stack();//存储运算符
string operaters = "+-*/()%";
foreach (string str in strs)
{
if (str.Equals(string.Empty)) continue;//如果为空继续 if (operaters.IndexOf(str) != -1)//是操作符
{
if (str.Equals("("))
{
Operator.Push(str);//进栈
}
else
{
Calculat(Digital, Operator, str);
} }
else//不是操作符
{
Digital.Push(decimal.Parse(str));
}
}
if (Operator.Count != 0) Calculat(Digital, Operator, ")");//计算栈中剩余部分
return (decimal)Digital.Pop();
} /// <summary>
/// 计算
/// </summary>
/// <param name="str">操作符</param>
private static void Calculat(Stack Digital, Stack Operator, string str)
{
if (Operator.Count == 0)
{
Operator.Push(str);
return;//已经没有运算符了
}
string prev = (string)Operator.Peek();
if (prev == null || prev.Equals(string.Empty)) return;//元素不存在
if (prev.Equals("("))
{
if (str.Equals(")"))
{
Operator.Pop();//移除操作符
return;
}
else
{
Operator.Push(str);//进栈
}
}
else
if (compareOperater(str) <= compareOperater(prev))//第一个操作符等级小于等于第二个,则进行运算
{
Operator.Pop();//移除操作符 switch (prev)
{
case "+"://进行加操作
{
decimal num1 = (decimal)Digital.Pop();//返回第一个元素
decimal num2 = (decimal)Digital.Pop();//返回第二个元素
Digital.Push(num2 + num1);
}
break;
case "-":
{
decimal num1 = (decimal)Digital.Pop();//返回第一个元素
decimal num2 = (decimal)Digital.Pop();//返回第二个元素
Digital.Push(num2 - num1);
}
break;
case "*":
{
decimal num1 = (decimal)Digital.Pop();//返回第一个元素
decimal num2 = (decimal)Digital.Pop();//返回第二个元素
Digital.Push(num2 * num1);
}
break;
case "/":
{
decimal num1 = (decimal)Digital.Pop();//返回第一个元素
decimal num2 = (decimal)Digital.Pop();//返回第二个元素
Digital.Push(num2 / num1);
}
break;
case "%":
{
decimal num1 = (decimal)Digital.Pop();//返回第一个元素
Digital.Push(num1 / 100);
}
break;
}
Calculat(Digital, Operator, str);//继续比较
}
else
{
Operator.Push(str);//进栈
}
}
/// <summary>
/// 运算符级别
/// </summary>
/// <param name="operater">操作符</param>
/// <returns></returns>
private static int compareOperater(string operater)
{
string str3 = "(";
string str2 = "*/%";
string str1 = "+-";
string str0 = ")";
if (str0.IndexOf(operater) != -1) return 0;//零级运算符
if (str1.IndexOf(operater) != -1) return 1;//一级运算符
if (str2.IndexOf(operater) != -1) return 2;//二级运算符
if (str3.IndexOf(operater) != -1) return 3;//三级运算符
return -1;
}
static void Main(string[] args)
{
//公式
string formula = "C*2-B+L"; //这边上下关系对应,送C=3之类的也可以,做个转换
string[] name = new string[] { "C", "B", "L" };
decimal[] value = new decimal[]{ 3, 5, 3};
//完成表达式计算
decimal Y = Regular(formula, name, value);
for(int i=0;i<name.Length;i++)
Console.WriteLine("{0}={1}", name[i], value[i]);
Console.WriteLine("Y={0}={1}",formula,Y);
Console.ReadLine();
}