我对C#很陌生,并尝试制作一个如何更改listview地址簿中的名称,地址等的方法。
关于如何将“.Name”部分变成可以作为参数传递给方法的变量,我一直在摸不着头脑。
为了我的方法工作,我需要能够使用参数将“.Name”部分更改为:“。Address”,“。Phone”等。
Box1表示已禁用的文本框,仅显示列表视图中所选项目的相关信息。 Box2表示用户可以键入他想要进行的更改的框。
代码正在运行,这只是为了学习如何提高效率而不是重复。
private void CheckInput(string box1, string box2, string details)
{
if (box2 != box1 && box2 != "")
{
DialogResult dialogResult = MessageBox.Show(
"Are you sure you want to change the " + details
+ " from, " + box1 + ", to, " + box2 + "?", "Warning",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes)
{
people[listView1.SelectedItems[0].Index].Name = box2;
if (box2 == "")
{
listView1.SelectedItems[0].Text = box1;
}
else
{
listView1.SelectedItems[0].Text = box2;
}
}
if (dialogResult == DialogResult.No)
{
}
}
}
class Person
{
public string Name
{
get;
set;
}
public string Email
{
get;
set;
}
public string Address
{
get;
set;
}
public string Phone
{
get;
set;
}
}
答案 0 :(得分:0)
我会选择单独的名字和制定者代表:
private void CheckInput(string oldValue, string newValue,
string propertyName, Action<string> setterDelegate)
{
...
setterDelegate(newValue);
}
CheckInput("old", "new", nameof(value.Name), newVal => value.Name = newVal);
如果你想坚持使用名称Set object property using reflection,你也可以使用反射,但你仍然需要传递“人”作为参数。另一个更好的选择是使用表达式树,类似于LINQ-to-SQL如何设置查询并获取属性的名称 - Retrieving Property name from lambda expression。
注意:通常框架提供了自己的绑定值和验证机制。如果您需要练习重新发明轮子,请查看带有属性的注释属性 - Validation using attributes(小心,因为它包含完整的答案,因此您可能首先要阅读属性)。