LINQ to XML设置值,如果它不为null,否则使用构造函数中的默认值

时间:2013-10-16 08:44:04

标签: c# xml linq linq-to-xml

我需要读取XML文件,我正在使用LINQ to XML方法。创建Ignore类的实例时存在问题,因为modepattern属性不必在XML中,如果它们应设置为默认值,则在Ignore类的构造函数。

以下代码有效,但前提是XML文件中存在所有属性。

var items = xmlFile.Descendants("item")
                   .Select(x => new Item()
                       {
                           SourcePath = x.Attribute("source").ToString(),
                           DestinationPath = x.Attribute("destination").ToString(),
                           IgnoredSubitems = new List<Ignore>(
                              x.Elements("ignore")
                               .Select(y => new Ignore(
                                   path: y.Value,
                                   mode: GetEnumValue<IgnoreMode>(y.Attribute("mode")),
                                   pattern: GetEnumValue<IgnorePattern>(y.Attribute("style"))
                                ))
                            )
                        })
                    .ToList();
用于设置枚举类型的

GetEnumValue方法如下所示

private static T GetEnumValue<T>(XAttribute attribute)
{
    return (T)Enum.Parse(typeof(T), attribute.ToString());
}

有没有办法只在有值的情况下设置字段,否则使用构造函数中定义的默认值? Ignore应该是不可变的因此我不能首先使用默认值对其进行实例化,然后尝试为属性分配值,这些属性仅提供getter。

修改

基于误解的答案。 Ignore类如下所示。请注意,这不是我的班级。

public class Ignore
{
    string Path { get; }
    IgnoreMode Mode { get; } // enum
    IgnorePattern Pattern { get; } // enum

    public Ignore(string path, IgnoreMode mode = someDefaultValue, IgnorePattern pattern = someDefaultPattern) 
    { 
        ... I don't know what happens here, but I guess that arguments are assigned to the properties ... 
    }
}

默认值可能随时间而变化,我无法在装载程序中对其进行硬编码。

2 个答案:

答案 0 :(得分:1)

你可以使用像这样的反射

var constructor = typeof(Ignore).GetConstructor(new Type[]{typeof(string),typeof(IgnoreMode),typeof(IgnorePattern)});
var parameters = constructor.GetParameters(); // this return list parameters of selected constructor
var defaultIgnoreMode = (IgnoreMode)parameters[1].DefaultValue;
var defaultIgnorePattern = (IgnorePattern)parameters[2].DefaultValue;

答案 1 :(得分:0)

将字符串参数传递给GetEnumValue方法

var items = xmlFile.Descendants("item")
                   .Select(x => new Item()
                       {
                           SourcePath = x.Attribute("source").ToString(),
                           DestinationPath = x.Attribute("destination").ToString(),
                           IgnoredSubitems = new List<Ignore>(
                              x.Elements("ignore")
                               .Select(y => new Ignore(
                                   path: y.Value,
                                   mode: GetEnumValue<IgnoreMode>((string)y.Attribute("mode")),
                                   pattern: GetEnumValue<IgnorePattern>((string)y.Attribute("style"))
                                ))
                            )
                        })
                    .ToList();

现在改变你的方法

private static T GetEnumValue<T>(string attribute)
{
    if(attribute==null) return YOURDEFAULTVALUE;
    else return (T)Enum.Parse(typeof(T), attribute);
}

希望它适合你