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

不,匿名类型仍然遵循其他类型的规则,只是没有在编译时明确定义。要执行您想要的操作,您必须定义两种不同的类型。

如果您不想在 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
}
于 2013-01-16T19:13:01.963 回答
2

我认为您不想删除该属性。您真正想要做的是在 UI 上进行测试,如果它为空则不显示任何内容。

于 2013-01-16T19:16:16.133 回答
1

你应该看看 dynamic 而不是 var:

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这两个 plus 的类型不同displayProperty3,因此您不能尝试将它们都粘贴到同一个变量中,就像您可以将 astring和 anint放在同一个变量中一样。

于 2013-01-16T19:16:17.340 回答