2

以下のようなコードがあります。

var selected = “A”;
bool isSelected = selected == "A" || selected == "C";
var codeLists = new
{
    displayProperty1 = isSelected ? "property1" : null,
    displayProperty2 = isSelected ? "property2" : null,
    displayProperty3 = selected == "C" ? "property3" : null
};

したがって、私の目標は、条件を満たさないプロパティを削除することです。上記のコードでは、selectedです"A"。したがって、displayProperty3の値になりnullます。displayProperty3しかし、「A」が選択されている場合は2 properties、オブジェクトにのみ存在するように削除したいと思います。

これを行うための適切で効率的な方法があれば、私はそれを感謝します.

4

5 に答える 5

2

プロパティを削除したくないと思います。本当にやりたいことは、null の場合は何かを表示しない UI のテストを行うことです。

于 2013-01-16T19:16:16.133 に答える
2

いいえ、匿名型は引き続き他の型の規則に従います。コンパイル時に明示的に定義されていないだけです。必要なことを行うには、2 つの異なる型を定義する必要があります。

そのプロパティを UI に表示したくない場合(たとえば、自動生成されたグリッドにバインドしていて、それを列にしたくない場合)、UI でそれを処理します。

ただし、これを行う必要がある場合は、2 つの異なる型 (匿名または明示的) を作成する必要があります。

var selected = "A";
bool isSelected = selected == "A" || selected == "C";
dynamic codeLists;
if(selected == "C")
{
    codeLists = new
    {
        displayProperty1 = isSelected ? "property1" : null,
        displayProperty2 = isSelected ? "property2" : null
    }; 
}
else
{
    codeLists = new
    {
        displayProperty1 = isSelected ? "property1" : null,
        displayProperty2 = isSelected ? "property2" : null,
        displayProperty3 = "property3" 
    }; 
}

共通のプロパティを使用して基本型を作成した方がよいでしょうが、いずれにしても、2 つの異なる型になります。

public class CodeList
{
    public string displayProperty1 {get; set;}
    public string displayProperty2 {get; set;}
}

public class CodeListC : CodeList
{
    public string displayProperty3 {get; set;}
    // Other two properties will be inherited
}
于 2013-01-16T19:13:01.963 に答える
1

varではなくdynamicを確認する必要があります。

http://msdn.microsoft.com/en-us/library/dd264736.aspx

Varは、コンパイル時に新しい厳密に型指定されたエンティティを作成する方法です。動的は強く型付けされておらず、コードの実行中にプロパティを追加/削除できます。

于 2013-01-16T19:18:13.467 に答える
1

私の理解が正しければ、あなたが構築しているオブジェクトは何らかの形でインターフェイスを表しているはずですよね? さて、プロパティの有無に基づいてインターフェイスを構築することは、私にはあまり魅力的ではないように思えます。コードが悪夢になるので、実際にはひどい考えだと思います。
やり方を見直すべきだと思います。たとえば、辞書の使用を検討しましたか? 何かが存在するかどうかを確認できます。さらに、それを処理するために必要なコードがはるかに簡単になります (まず第一に、リフレクションはありません...)。
質問に投稿したものと同等のコードは次のとおりです。

var selected = “A”;
bool isSelected = selected == "A" || selected == "C";

var codeList = new Dictionary<string, string>();
if(isSelected) {
    codeList["displayProperty1"] = "property1";
    codeList["displayProperty2"] = "property2";
}

if(selected == "C")
    codeList["displayProperty3"] = "property3";

!isSelected の場合、ディクショナリには displayProperty1 および displayProperty2 というキーが含まれません。

于 2013-01-16T19:28:31.497 に答える
0

匿名オブジェクト (およびvar) が明示的に型付けされていないからといって、型がないというわけではありません。型はコンパイル時に完全に定義できる必要があります。そうしないと、コードがビルドされません。

displayProperty1プロパティとを持つ型のオブジェクトは、displayProperty2これら 2 つの plus を持つ型のオブジェクトとは異なるため、 aと anをdisplayProperty3同じ変数に入れることができないのと同じように、両方を同じ変数に貼り付けようとすることはできません。stringint

于 2013-01-16T19:16:17.340 に答える