C# 属性与方法?
也许我忽略了一些显而易见的东西,但我在代码中看到,您可能有一个类似“hairolor”的属性,然后是一个类似“hairolor.Update()”的方法。这可能吗C# 属性与方法?,c#,.net,C#,.net,也许我忽略了一些显而易见的东西,但我在代码中看到,您可能有一个类似“hairolor”的属性,然后是一个类似“hairolor.Update()”的方法。这可能吗 Person person = new Person(int personID); person.HairColor = "Blonde"; person.HairColor.Update(); 我有一些特定的属性,我希望能够根据具体情况进行扩展。我想我可以有一个名为“hairolorupdate”的方法,但似乎hairolor.U
Person person = new Person(int personID);
person.HairColor = "Blonde";
person.HairColor.Update();
我有一些特定的属性,我希望能够根据具体情况进行扩展。我想我可以有一个名为“hairolorupdate”的方法,但似乎hairolor.Update()应该是可能的。我不想使用“set”,因为我不想总是这样更新数据库
我这样做的原因是,我可能只想调用数据库来更新一列,而不是调用save方法来更新每一列,希望提高效率。
person.HairColor.update()
只意味着HairColor
属性返回的类型有一个名为Update
的方法。在您的示例中,HairColor
似乎是一个字符串
,因此要实现这一点,您需要为字符串
实现一个扩展方法。比如说
static class StringExtension
{
public static void Update(this string s)
{
// whatever
}
}
然而,我不认为这样做有什么意义。Update
方法是一个对字符串有效的静态方法,因此它不会影响Person
实例。(即使string
确实有Update
方法,它也与Person
类型无关)
我相信您会希望像其他人所指出的那样,在
Person
上使用Update
方法 它不是带有方法的属性
,而是属性返回的类型
中声明了该方法。因此,使用属性并在返回值(即类型)中调用方法。这是不可能的,除非HairColor的返回值具有Update()方法。另一种方法是
Person person = new Person(int personID);
person.HairColor = "Blonde";
person.Update();
更新方法检查哪些字段已更新,然后根据该信息更新数据库。我认为您需要Person类的更新方法,而不是string上的更新方法:
Person person = new Person(int personID);
person.HairColor = "Blonde";
// set other properties
person.Update();
实际上,混合person类的业务逻辑和数据库相关逻辑很少是好主意。所以,我会说:
dbSession.SaveOrUpdate(person); // NHibernate
甚至扩展方法:
public static void Update(this Person person)
{
// connect to database and do update query
}
HairColor
可能必须是一种结构类型,才能实现您想要的功能。另外,您还必须执行运算符重载。我不确定这是否真的是你想要追求的设计路径。如果出于某种不正当的原因,你绝对必须这样做,这就是你需要的结构定义(非常粗略,LOL):
然后,您可以像这样重新定义Person
对象:
public class Person
{
public HairColorStruct HairColor { get; set; }
// whatever else goes here...
}
在您的代码中,HairColor
可以简单地分配给您想要的任何东西,只要它是一个字符串
:
var person = new Person();
person.HairColor = "Blonde";
// this will emit "True" to the console...
if (person.HairColor == "Blonde")
{
Console.WriteLine(true);
}
else
{
Console.WriteLine(false);
}
// update the info per your logic...
person.HairColor.Update();
// you can change the hair color and update again, LOL
person.HairColor = "Brown";
person.HairColor.Update();
你就不能这样做:
public class HairColor : String
{
private int _personID;
public HairColor(int personID)
{
_personID = personID;
}
public void Update()
{
//update the database here for hair color
}
}
通过这种方式,您可以对特定功能进行更多控制。记住,课堂责任
此解决方案仅适用于您确实希望更新一列的情况
希望这能有所帮助。+1感谢您刚才提到的“我不认为这样做有什么意义”。@TimSchmelter:这就是我试图用不太有意义的部分来涵盖的内容。这里唯一的缺点是每个字符串现在都可以更新了。我猜你可以通过智能地使用名称空间来解决这个问题,不过…@code4life:我不认为这是唯一的缺点。对我来说,这不像是普通的C代码。我相信更新方法应该是在
Person
类型上。这对我想做的不起作用,但我喜欢你的答案。我经常使用扩展,但我想它不适合我正在尝试的工作。我目前有一个类的更新,它只更新所有字段。我一次只想更新一个字段。所以我只需要写一个方法来检查哪些字段被更新了,或者只是传递一个字段来更新。谢谢你的时间。你只是通过一个字段一个字段地更新使事情变得更复杂。在Person类中提供更新所有字段的Update
方法(使用参数)。dbms的性能几乎没有差别。如果你想更新一列,我会看看我的答案。其他的都是很好的解决方案,但这正是我要做的。BI在为OP写这篇文章,比我快+1关于回答,我想检查哪些属性被更新了,并且只更新那些属性可能更有意义。这就是我想要达到的基本目标。我希望避免在只需要更新一个字段时更新整个记录。
public class HairColor : String
{
private int _personID;
public HairColor(int personID)
{
_personID = personID;
}
public void Update()
{
//update the database here for hair color
}
}