[英]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
)并不意味着它们没有类型。 该类型需要能够在编译时完全定义,否则您的代码将无法生成。
由于与性能的类型的对象displayProperty1
和displayProperty2
是不同的类型,一个与这两个加displayProperty3
,那么你就不能试着他们俩坚持到相同的变量,任何比你更可以把一个string
和int
变成同一个
您应该看一下动态而不是var:
http://msdn.microsoft.com/en-us/library/dd264736.aspx
Var是在编译时创建新的强类型实体的方法。 动态类型不是强类型,可以在代码执行期间添加/删除属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.