C# 在C语言中,如何动态指定对象的成员,如PHP中的obj[";abc";]
说我有课C# 在C语言中,如何动态指定对象的成员,如PHP中的obj[";abc";],c#,member,C#,Member,说我有课 public class Employee { public string name = ""; public int age = 20; } 现在我想要一个函数,它可以动态地获取Employee的指定成员的值 public class Util<T> { public static string GetValue(T obj, string member) { // how to write } } 公共类Uti
public class Employee
{
public string name = "";
public int age = 20;
}
现在我想要一个函数,它可以动态地获取Employee的指定成员的值
public class Util<T>
{
public static string GetValue(T obj, string member)
{
// how to write
}
}
公共类Util
{
公共静态字符串GetValue(T obj,字符串成员)
{
//如何写作
}
}
这样我就可以像这样使用它
Employee p1 = new Employee();
string a = Util<Employee>.GetValue(p1, "age"); // a should be "20"
Employee p1=新员工();
字符串a=Util.GetValue(p1,“年龄”);//a应该是“20”
怎么做?像access成员一样,在PHP反射中使用obj[“?”]。请看这里: 哦,还有 在我们自己的世界里如此 更新 叹息。。。这一切都是关于“道德准则”。。。给你:
p1.GetType().GetProperty("age").GetValue(p1,null);
但是一定要检查链接,有东西要学 是的,这叫做反射。请参见尝试以下代码:
// get value of private field: private double _number
int value = (int)typeof(p1).InvokeMember("age",
BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
null, p1, null);
或
查看更多详细信息参数“年龄”来自何处?您应该考虑其他属性选择不存储在字符串中的设计
例如,如果您希望显示一个下拉列表,允许用户选择要排序的列,您可能希望将
比较器
从视图传递到模型,这将快得多,并且使用正确的数字排序而不是字典排序。虽然我在这里看到了大量反射的用法,也许在你的用例中你可以
object p1 = new Employee();
var employee = p1 as Employee;
// optionally you could do a nullcheck
string a = employee.age; // a should be "20"
反思是有效的,但在你的情况下,我不会走那么远。但是也许你需要泛型,那么是的,用反射来代替。我从来不知道你可以在PHP中使用
$obj['property']
。你是说JavaScript吗?听起来像是关联数组。我认为动态成员访问的PHP语法是$obj->$var。您是否试图从匿名类型获取值?如果是这样的话,尝试“按示例强制转换”技巧可能会更容易。比如PHP中的$_REQUEST[“type”](很好,它不是类的对象…),或者ActionScript3。虽然这在C中是可能的,但使用反射(参见下面的答案),它是不规则的,而且非常冗长。我建议你用另一种方式解决你的问题。例如,如果您需要按字符串索引的松散类型的属性集合,请尝试使用字典
。由于Employer/Student/Patient的所有类都有“age”成员,因此函数看起来像:int ave=GetAverage(students,“age”),这是我的问题:我有几个集合ObserverableCollection,我需要一个函数来计算这类集合的平均年龄。由于Employ/Student/Patient的所有类都有“age”成员,因此函数看起来像:int ave=GetAverage(students,“age”)@demaxSH:最好通过lambda,比如GetAverage(students,s=>s.age)
。您甚至可以在LINQ库中找到一个函数,该函数已经为您进行了平均。对于静态类呢?
object p1 = new Employee();
var employee = p1 as Employee;
// optionally you could do a nullcheck
string a = employee.age; // a should be "20"