2017-12-21 67 views
0

私は、アプリケーションのXML設定ファイルを読み書きするWindows.Forms.PropertyGridを使用して表示するシリアライズ可能なプロパティオブジェクトに属性を使用しています。私はこれを達成するためにC#属性を使用し、[Description][DefaultSettingValueAttribute]が含まれるように属性の値を組み合わせることができるようにしたいと考えています。C#での属性の結合

例えば、ここに一つの特性が定義されている方法です。

`[Category("General")] 
[Description("Default Filename")] 
[global::System.Configuration.DefaultSettingValueAttribute("sample.txt")] 
public string DefaultFileName { get; set; } = "sample.txt";` 

私は何をできるようにしたいことのライン上のものです:どのように私は上の任意の提案

`[Category("General")] 
[global::System.Configuration.DefaultSettingValueAttribute("sample.txt")] 

[Description("Default Filename: " + 
global::System.Configuration.DefaultSettingValueAttribute] 

public string DefaultFileName { get; set; } = "sample.txt";` 

これを達成できるか?

+0

これはあまり明確ではありません。 'Description'属性に文字列が含まれている場合は、任意の文字列を含めることができます。しかし、文字列に属性を追加しようとしているようです。 –

+0

正しいですか?文字列に属性を追加しようとしています(別の属性の値です)。 異なる属性間で "sample.txt"を手動でコピーしないようにしようとしています。一度 "DefaultValue"を定義し、その値を他の属性で再利用したいとします。 – user9128309

答えて

0

2つの文字列が異なる意味を持つ場合、私はそれらを組み合わせません。あなたがそれらを組み合わせると、あなたが持っているものは一つの大きな文字列であり、コードのどの部分がその文字列を見ていても、それを元の部分に戻す方法を知る必要があります。

2つの文字列を含む属性を簡単に作成できます。たとえば、

public class SomeAttribute : Attribute 
{ 
    public SomeAttribute() { } 

    public SomeAttribute(string category, string description) 
    { 
     Category = category; 
     Description = description; 
    } 
    public string Category { get; set; } 
    public string Description { get; set; } 
} 

これらを組み合わせる必要はありません。

しかし、別の質問は、どういうわけか、実際には同じ属性に属しているということですか?あなたの属性がどのように使われているのか分かりません。しかし、それらが本質的に関連していない限り、それらを別々の属性として保つことさえ可能かもしれません。 2つの文字列の間に論理的な区別がある場合は、2つの文字列を使用し、属性に対しても同じ文字列を使用します。一つの属性は、他から継承するため

あなたが望むかもしれないもの

それともは次のとおりです。

public class BaseAttribute : Attribute 
{ 
    public BaseAttribute() { } 

    public BaseAttribute(string defaultValue = null) 
    { 
     DefaultValue = defaultValue; 
    } 
    public string DefaultValue { get; set; } 
} 

public class SomeAttribute : BaseAttribute 
{ 
    public SomeAttribute() { } 

    public SomeAttribute(string category, string description, string defaultValue = null) 
     :base(defaultValue) 
    { 
     Category = category; 
     Description = description; 
    } 
    public string Category { get; set; } 
    public string Description { get; set; } 
} 

今、第二の属性は、独自のプロパティが含まれているプラ​​スbase属性のこと。

+0

Scottさんに感謝します。おそらく、最初は明確になっていたはずです。なぜなら、最終的にWindows.Forms.PropertyGridにプロパティを表示/編集するためにカスタム属性を避けているからです。私はカスタム属性を使用しようとしましたが、カスタム属性を認識して説明などの項目を正しく表示するためにPropertyGridを取得できません。ですから、私がPropertyGridをベースクラスの代わりに自分の属性を使用するようにするには、私のシナリオでは動作しません。 – user9128309

関連する問題