Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中,如何动态指定对象的成员,如PHP中的obj[";abc";]_C#_Member - Fatal编程技术网

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"