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

C# 属性与方法?

C# 属性与方法?,c#,.net,C#,.net,也许我忽略了一些显而易见的东西,但我在代码中看到,您可能有一个类似“hairolor”的属性,然后是一个类似“hairolor.Update()”的方法。这可能吗 Person person = new Person(int personID); person.HairColor = "Blonde"; person.HairColor.Update(); 我有一些特定的属性,我希望能够根据具体情况进行扩展。我想我可以有一个名为“hairolorupdate”的方法,但似乎hairolor.U

也许我忽略了一些显而易见的东西,但我在代码中看到,您可能有一个类似“hairolor”的属性,然后是一个类似“hairolor.Update()”的方法。这可能吗

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
     }
}