簡體   English   中英

是否可以從c#中的對象修改或刪除匿名類型?

[英]Is it possible to modify or remove an anonymous type from an object in c#?

我有一段類似下面的代碼:

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

如果有任何適當有效的方法可以做到這一點,我將不勝感激。

我認為您不想刪除該屬性。 您真正想要做的是在UI上進行測試,如果該測試為null,則該測試不會顯示任何內容。

不,匿名類型仍然遵循其他類型的規則,只是在編譯時未明確定義它們。 要執行您想要的操作,您必須定義兩種不同的類型。

如果您不想在UI中顯示該屬性(例如,如果您綁定到自動生成的網格並且您不希望將其作為列),則可以在UI中處理該屬性。

但是,如果必須執行此操作,則必須創建兩種不同的類型(匿名或顯式):

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

如果創建具有公共屬性的基本類型會更好 ,但是無論哪種方式,它們都將是兩種不同的類型:

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
}

如果我正確理解,您正在構建的對象應該以某種方式表示接口,對嗎? 現在,基於屬性的存在/不存在來構建接口對我來說並不是很吸引人,我認為這實際上是一個糟糕的主意,因為您的代碼將成為一場噩夢。
我認為您應該修改方法。 您是否考慮過使用字典 您仍然可以檢查是否存在某些東西,再加上處理所需的代碼,這將變得更加簡單(首先,沒有任何反射...)。
這是您在問題中發布的內容的等效代碼:

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的鍵。

僅僅因為未顯式鍵入匿名對象(和var )並不意味着它們沒有類型。 該類型需要能夠在編譯時完全定義,否則您的代碼將無法生成。

由於與性能的類型的對象displayProperty1displayProperty2是不同的類型,一個與這兩個加displayProperty3 ,那么你就不能試着他們倆堅持到相同的變量,任何比你更可以把一個stringint變成同一個

您應該看一下動態而不是var:

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

Var是在編譯時創建新的強類型實體的方法。 動態類型不是強類型,可以在代碼執行期間添加/刪除屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM