是否可以在c#中修改或删除对象中的匿名类型?

时间:2013-01-16 19:07:45

标签: c# object optimization anonymous-types ternary-operator

我有一段代码如下:

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

如果有任何正确有效的方法,我会很感激。

5 个答案:

答案 0 :(得分:3)

我认为您不想删除该属性。你真正想做的是在UI上进行测试,如果它为null,则不会显示。

答案 1 :(得分:2)

不,匿名类型仍然遵循其他类型的规则,它们在编译时没有明确定义。要做你想做的事,你必须定义两种不同的类型。

如果您不想在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
}

答案 2 :(得分: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的键。

答案 3 :(得分:0)

仅仅因为未明确键入匿名对象(和var)并不意味着它们没有类型。该类型需要能够在编译时完全定义,否则您的代码将无法构建。

由于具有属性displayProperty1displayProperty2的类型的对象与具有这两个加displayProperty3的类型的对象不同,因此您不能尝试将它们都插入同一个变量,除了可以将stringint放入同一个变量之外。

答案 4 :(得分:0)

你应该看看dynamic而不是var:

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

Var是一种在编译时创建新的强类型实体的方法。动态类型不是强类型,可以在代码执行期间添加/删除属性。