0

"apples,bananases,peaches" という形式のコンマ区切りの文字列を含む Fruits というプロパティがあります。

Fruits プロパティを操作しやすくするために、同じクラスにリストを作成したいと考えています。アクセサーは、リストでサポートされていないかのように見えるため、機能しません。

基本的に、Fruits プロパティに基づいて自動入力される FruitList というプロパティが必要です。項目を追加するか、FruitList を操作するときに、果物のプロパティを自動入力する必要があります。

Entity フレームワークの Fruits プロパティが必要です。

4

3 に答える 3

3

ロジックを反転できます。

List<string> fruitsList = new List<string>();
public List<string> FruitsList
{
    get
    {
        return fruitsList;
    }
}

public string Fruits
{
    get
    {
        return string.Join(',', fruitsList);
    }
    set
    {
        // Incomplete, does not handle null
        FruitsList.Clear();
        FruitsList.AddRange(value.Split(','));
    }
}

がを見て判断されるFruits場合は、更新について心配する必要はありません。Entity Frameworkのプロパティとして必要だとおっしゃいましたが、EF はそれがフィールドによってサポートされているかどうかを気にしません。FruitsFruitsListFruitsstringstring

于 2013-02-20T13:05:02.193 に答える
1

これを行う唯一の現実的な方法は、変更を監視できるコレクションを使用し、変更時に発生したイベントを処理して、プロパティを更新することです。

のようなものObservableCollection<T>が法案に適合します。

例:

public class MyObject
{
    public string Fruits{get;set;}

    public IList<string> FruitList 
    {
        get
        {
            var list = new ObservableCollection<string>(Fruits.Split(','));
            list.CollectionChanged += (s,ea) => {
               var items = (IList<string>)s;
               Fruits = String.Join(",",items);
            };
            return list;
        }
    }
}

使用法:

var obj= new MyObject(){ Fruits="Apple,Banana,Orange" };
var list = obj.FruitList;
list.Add("Satsuma");
list.Add("Grapes");
list.Remove("Apple");
Console.WriteLine(obj.Fruits); // Output: Banana,Orange,Satsuma,Grapes

実例: http: //rextester.com/KCT33825

ここでの概念が機能するのを見て、上記の実装は少し危険を伴うことに注意する価値があります。アクセサObservableCollectionを呼び出すたびに新しいものが作成され、意図しない結果が生じる可能性があります。get

たとえば、元の行の直前に次の行を追加すると、次のようになりますConsole.WriteLine

Console.WriteLine("{0}", obj.FruitList == list);

それはあなたが期待するかもしれない(そしてfalse概念的にはそうすべきである)ように奇妙に見えるかもしれない出力を出し、同じリストを指し示します。listobj.FruitList

これを回避するには、実装を変更して1つだけを作成しObservableCollection、常にgetアクセサーからそれを返します。

public class MyObject
{
    private string fruits;
    private ObservableCollection<string> fruitList;
    public string Fruits
    {
        get{ return this.fruits; }
        set
        {
            this.fruits = value;
            this.fruitList = CreateFruitList();
        }
    }

    private ObservableCollection<string> CreateFruitList()
    {
        var list = new ObservableCollection<string>(this.fruits.Split(','));
        list.CollectionChanged += (s,ea) => {
           var items = (IList<string>)s;
           this.fruits = String.Join(",",items);
        };
        return list;
    }


    public IList<string> FruitList 
    {
        get
        {

            return fruitList;
        }
    }
}

今、すべてが再び世界で正しいです!

于 2013-02-20T12:53:57.703 に答える
0

できることは次のとおりです。カンマ区切りのリストのプロキシを作成します。

public class MyClass
{
    public string Fruits {get;set;}

    public string [] FruitList {
        get { return Fruits.Split(new [] {','}); }
        //warning, the setter is dangerous
        set { Fruits = string.Join(',', value); }
    }
}

セッターが危険だと言うときは、配列の1つの要素を変更しても、Fruitが更新されないことを意味します。新しい配列をプッシュした場合にのみ更新されます。その動作が必要な場合は、ObservableCollectionを使用して実装することを検討してください

于 2013-02-20T12:54:19.857 に答える