Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# - Fatal编程技术网

C# 获取属性的名称

C# 获取属性的名称,c#,C#,我想找出一个属性的名称,,我无法访问它的父对象(如上所述的人)。可能吗?不,不可能。您的Person.Firstname只是一个值。该值不知道它在代码中的位置或来源。在C#6中,您可以使用nameof,但必须在将其传递给Do之前使用它: var person = new Person(); Do(person.Firstname); static void Do(object prop) { //find out "Firstname"... } 如果需要值和名称,则必须将它们作为单

我想找出一个属性的名称,,我无法访问它的父对象(如上所述的人)。可能吗?

不,不可能。您的
Person.Firstname
只是一个值。该值不知道它在代码中的位置或来源。

在C#6中,您可以使用
nameof
,但必须在将其传递给
Do
之前使用它:

var person = new Person();
Do(person.Firstname);

static void Do(object prop)
{
    //find out "Firstname"...
}
如果需要值和名称,则必须将它们作为单独的参数传递:

Do(nameof(person.Firstname));

static void Do(object prop)
{
    // prop is the string Firstname
}

也许这样的方法可以帮助您:

Do(person.FirstName, nameof(person.Firstname));

static void Do(object prop, string name)
{
    // name is the string Firstname
    // prop is the value of person.Firstname
}

实际上不能用属性来做,但可以用方法来做,包括一个与属性完全相同的方法。比如说

Do(person, p => p.FirstName);
Do(person, p => p.LastName);
班级人员
{
公共字符串GetName(){返回“John Doe”;}
}
班级计划
{
静态void Main(字符串[]参数)
{
var p=新人();
Do(p.GetName);//注意GetName后面的no()
}
静态无效Do(函数f)
{
WriteLine(String.Format(“调用方通过名为{1}”、f.Invoke()、f.method.Name的方法发送了值“{0}”);
}
}

你想知道这个人的
名字
,还是你基本上需要一个字符串
“Firstname”
?你必须为“name”指定一个单独的参数。没有任何东西可以阻止某人通过
Do(4)
,在这种情况下,没有“name”要获得。如果你添加了你需要的名称,也许你可以得到一个实际有用的答案。出于好奇,你需要它做什么?按照你的逻辑,将
int x
传递到函数中会使你无法发现它是
int
@devRicher:这根本不一样。
Firstname
是一个字符串。这是一个ll函数
Do
可以知道它。它不知道它是一个字符串,恰好是
Person
的属性,名为
Firstname
。这是OP想要知道的。这必须单独传递。好的,谢谢!如果没有其他可能,它可能会工作,我会检查它。。。
Do(person, p => p.FirstName);
Do(person, p => p.LastName);
class Person
{
    public string GetName() { return "John Doe"; }
}

class Program
{
    static void Main(string[] args)
    {
        var p = new Person();
        Do(p.GetName);  //Notice no () after GetName
    }


    static void Do(Func<string> f)
    {
        Console.WriteLine(String.Format("The caller sent the value '{0}' via a method named {1}", f.Invoke(), f.Method.Name);
    }


}