17

XElementのXAttributeが存在しない場合に、デフォルト値を返すためのより簡単で優れた方法はありますか?:

私はこれをもっと短い方法で書き込もうとしています(これは2ライナーだからです):

var a = root.Attribute("testAttribute");
var v = (a == null ? "" : a.Value);

私のアプローチ:拡張メソッドを介して:

public static XAttribute Attribute(this XElement obj, string name, string defaultValue)
{
    if (obj.Attribute(name) == null)
        return new XAttribute(name, defaultValue);
    return obj.Attribute(name);
}

var v = root.Attribute("testAttribute", "").Value;

これには、速度に大きな悪影響を与えるような副作用がありますか?それを行うためのより良い方法はありますか?

4

2 に答える 2

26

これを行うには、はるかに簡単な方法があります。

var v = (string) root.Attribute("testAttribute") ?? "";

入力がnullの場合、から明示的な変換XAttributestringが返されます。null合体演算子は、空の文字列のデフォルト値を効果的に提供します。nullXAttribute

もちろん、拡張メソッドを作成することもできますが、私は上記の観点から作成します。また、柔軟性を高めるために、nameパラメーターをのXName代わりにタイプに変更します。string

于 2012-12-06T16:05:31.753 に答える
0

私のプロジェクトでも同様のものが必要でした。カスタム属性を作成しました

[AttributeUsage(AttributeTargets.Property)]
public class DefaultValue : Attribute
{
 public string ElementName {get; set;}
 public string AttributeName {get; set;}
 public object DefaultValue {get; set;}

public object GetValue(XElement element)
{
  var v = root.Attribute(AttributeName);
 if(v!= null)
  return v.value;
 else
  return DefaultValue
}
}

同様の使用法ですべてのプロパティにこの属性を使用しました

[DefaultValue(ElementName="elementName",AttributeName="attri",DefaultValue="Name")]
public string Prop{get; set;}

この属性のメソッドを呼び出すことで値を取得します

var attribute = propertyInfo.GetCustomAttribute(typeof(DefaultValue),false);
var value = attribute.GetValue(element);

お役に立てれば

于 2012-12-07T11:52:38.690 に答える