gpt4 book ai didi

c# - 为什么 ListBox.DisplayMember 接受字符串值?

转载 作者:太空宇宙 更新时间:2023-11-03 20:50:58 26 4
gpt4 key购买 nike

我目前对 C# 还很陌生,我的大部分知识都来自 Java 和 Python。话虽如此,我目前有以下代码:

public class Person
{
public int Person_ID { get; set; }
public String First_Name { get; set; }
public String Last_Name { get; set; }
public String EmailAddress { get; set; }


public String FullInfo
{
get
{
// Matthew Arnold (mtthwrnld@gmail.com)
return $"{First_Name}, {Last_Name}, ({EmailAddress})";
}
}

}

此处使用“FullInfo”属性:

private void button1_Click(object sender, EventArgs e)
{
//'Results' is a ListBox
//'people' is a List of type Person

DataAccess db = new DataAccess();
people = db.getPeople(lastNameText.Text);

Results.DataSource = people;
Results.DisplayMember = "FullInfo";
}

我的问题明确涉及这一行:Results.DisplayMember = "FullInfo";

这个作业实际上是如何工作的?我们将 DisplayMember 设置为 FullInfo 属性,但我们将其包装在 String 中。为什么我们不简单地执行 Results.DisplayMember = Person.FullInfo

编译器如何知道这不是任何旧的 String?以这种方式访问​​属性有什么好处?

最佳答案

你在这里处理反射。看看这个函数:

public static void GetDisplayName(object anyType, string displayName)
{
var type = anyType.GetType();

var displayProperty = type.GetProperty(displayName);
if (displayProperty != null)
{
Console.WriteLine($"DisplayName is {displayProperty.GetValue(anyType)}");
return;
}

var displayFiled = type.GetField(displayName);
if (displayFiled != null)
{
Console.WriteLine($"DisplayName is {displayFiled.GetValue(anyType)}");
return;
}

// can't find displayName
Console.WriteLine($"DisplayName is {type.Name}");
}

如果你这样调用它

var person = new Person
{
Person_ID = 42,
First_Name = "First",
Last_Name = "Last",
EmailAddress = "name@domain.com"
};

GetDisplayName(person, "FullInfo");

它会打印

DisplayName is First, Last, (name@domain.com)

就像您在问题中的示例一样,我们只将 "FullInfo" 作为字符串传递给它。但是 ListBox 的内部代码足够聪明,可以使用这个字符串作为实际值的映射

关于c# - 为什么 ListBox.DisplayMember 接受字符串值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55306263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com