2012-03-28 18 views
3

多分私は何かを見落としているかもしれませんが、 "HairColor"のようなプロパティと "HairColor.Update()"のようなメソッドがあるコードを見てきました。これは可能ですか?プロパティ付きプロパティ?

Person person = new Person(int personID); 
person.HairColor = "Blonde"; 
person.HairColor.Update(); 

私は、ケースバイケースで拡張できる特定の特性を持っています。私は "HairColorUpdate"と呼ばれるメソッドを持つことができると思いますが、HairColor.Update()が可能であるようです。私はいつもDBをこのように更新したくないので、 "set"を使いたくない。

私がこれをやっている理由は、データベースを呼び出して、効率を向上させることを望むすべての列を更新するsaveメソッドを呼び出すのではなく、1つの列を更新する必要があるからです。

+3

フィールドのフィールドを更新するだけで、操作が複雑になります。 Personクラスにすべてのフィールドを更新する 'Update'メソッドを提供します(Parametersを使用します)。 dbmsのパフォーマンスの違いはほとんどありません。 –

+0

1つの列を更新したい場合は、私の答えを見てください。他のものも良い解決策ですが、私はそれをやるしかありません。 B – Base33

答えて

8

person.HairColor.Update()は、HairColorプロパティから返されるタイプがUpdateというメソッドを持つということを意味します。あなたの例ではHairColorstringであるように見えるので、stringの拡張メソッドを実装する必要があります。例えば。何かのように

static class StringExtension 
{ 
    public static void Update(this string s) 
    { 
     // whatever 
    } 
} 

しかし、私はこれを行うのが分かりません。 Updateメソッドは、文字列に作用する静的メソッドなので、Personインスタンスには影響しません。 (たとえstringUpdateメソッドを持っていたとしても、Personタイプとは無関係です)。

他の人が指摘しているように、にUpdateメソッドを追加したいと思っています。

+0

+1には... – GETah

+2

+1「ちょっとこのことをしていない」と言われています。 – Jetti

+0

@TimSchmelter:それは私が多くの感覚の部分を作っていないことでカバーしようとしたものです。 –

0

メソッドではpropertyではありませんが、プロパティで返されたtypeにはそのメソッドが宣言されています。したがって、プロパティを使用し、型である戻り値の中でメソッドを呼び出します。

4

HairColorの戻り値にUpdate()メソッドがない限り、これはできません。これを実行する別の方法は、更新方法をチェックし、フィールドを更新し、その情報に基づいてデータベースを更新されているかを確認するには

Person person = new Person(int personID); 
person.HairColor = "Blonde"; 
person.Update(); 

を持つことです。

+0

+1確かに理にかなっています。 –

+0

私は、どのプロパティが更新されたかを確認するためにチェックし、それらを更新するほうが理にかなっていると思います。それが私が本質的に達成しようとしていることです。 1つのフィールドだけを更新する必要がある場合は、レコード全体を更新しないようにしたい。 –

0

私は、文字列のメソッドを更新していない、あなたはPersonクラスのUpdateメソッドが必要だと思う:

Person person = new Person(int personID); 
person.HairColor = "Blonde"; 
// set other properties 
person.Update(); 

は、実際に人クラスのビジネスロジックを混合し、データベース関連のロジックはめったに良いアイデアです。だから、私のようなものに行きたい:

dbSession.SaveOrUpdate(person); // NHibernate 

、あるいは拡張メソッド:

public static void Update(this Person person) 
{ 
    // connect to database and do update query 
} 
3

HairColorおそらくあなたが仕事をしたいものを作るために構造体型でなければならないであろう。さらに、演算子のオーバーロードを行う必要があります。これが本当にあなたが追求したいデザインパスなのかどうかは分かりません。

public struct HairColorStruct 
{ 
    private string m_hairColor; 

    public void Update() 
    { 
     // do whatever you need to do here... 
    } 

    // the very basic operator overloads that you would need... 
    public static implicit operator HairColorStruct(string color) 
    { 
     var result = new HairColorStruct(); 
     result.m_hairColor = color; 
     return result; 
    } 

    public static explicit operator string(HairColorStruct hc) 
    { 
     return hc.m_hairColor; 
    } 

    public override string ToString() 
    { 
     return m_hairColor; 
    } 

    public static bool operator ==(HairColorStruct from, HairColorStruct to) 
    { 
     return from.m_hairColor == to.m_hairColor; 
    } 

    public static bool operator ==(HairColorStruct from, string to) 
    { 
     return from.m_hairColor == to; 
    } 

    public static bool operator !=(HairColorStruct from, HairColorStruct to) 
    { 
     return from.m_hairColor != to.m_hairColor; 
    } 

    public static bool operator !=(HairColorStruct from, string to) 
    { 
     return from.m_hairColor != to; 
    } 
} 

あなたは、このようなあなたのPersonオブジェクトを再定義することができます::、いくつかのひねくれた理由で、あなたが絶対にはそれを行う必要がある場合、これはあなたが必要となる構造体の定義の種類(非常に大まかに、LOL)がある

あなたのコードで
public class Person 
{ 
    public HairColorStruct HairColor { get; set; } 

    // whatever else goes here... 
} 

HairColorは単にあなたがいる限り、それはstringだとして望むものは何でも割り当てることができます。

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(); 
+0

私はOPのためにこれを書いていました。それに私を打つ。答えに+1 – payo

0

は、あなただけ行うことができませんでした:あなたは、特定の機能を持つより多くのコントロールを持つことができます

public class HairColor : String 
{ 
    private int _personID; 

    public HairColor(int personID) 
    { 
     _personID = personID; 
    } 

    public void Update() 
    { 
      //update the database here for hair color 
    } 
} 

この道を。クラス責任を忘れないでください。

このソリューションは、実際には1つの列を更新したい場合にのみ使用します。

希望に役立ちます。

関連する問題