繁体   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