4

プロパティの値が作成者のコレクションであるプロパティ グリッドのプロパティを定義します。CreatorsEditorクラスを定義します。このクラスでは、HumanRolesCode変数を使用します。設定値のプロパティの属性でこの変数にアクセスするにはどうすればよいですか。HumanRolesCode の値を変更したい。例: [Editor(typeof(CreatorsEditor(HumanRolesCode = 10))]

私のコードは:

[Editor(typeof(CreatorsEditor), typeof(UITypeEditor))]
public string Creators { get; set; }
//-------------------------------------

public class CreatorsEditor : UITypeEditor
{
    public static int HumanRolesCode;

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
        if (svc != null)
        {
            CreatorFrm.HumanRoleCode = HumanRolesCode;
            CreatorFrm Frm = new CreatorFrm();
            if (svc.ShowDialog(Frm) == System.Windows.Forms.DialogResult.OK)
            {
                string HumanNames = "";
                for (int i = 0; i < Frm.DgvCreator.Rows.Count; i++)
                    if (Boolean.Parse(Frm.DgvCreator[0, i].Value.ToString()) == true)
                        HumanNames += Frm.DgvCreator[2, i].Value.ToString() + " , ";
                if (!string.IsNullOrEmpty(HumanNames))
                    HumanNames = HumanNames.Substring(0, HumanNames.Length - 3);
                return HumanNames;
            }
        }
        return value;
    }
}
4

1 に答える 1

2

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式である必要があります。

いくつかの値を割り当てることは不可能のようで、カスタム属性の宣言によっていくつかのランタイム コード (メソッド\プロパティ) が実行されるようにするのが一般的です。

カスタム属性は、追加情報をターゲットに関連付ける方法にすぎません。コンパイラは追加情報をメタデータに追加するだけです...コンパイル時に変更したい場合は、実行時にのみ存在する変数です。

さらに、リフレクションを使用してそれを取得するまで、カスタム属性のインスタンスは作成されません (再度 - 実行時、宣言はコンパイル時です)。

Jeffrey Richter の著書「CLR via C#」には、カスタム属性に関する章があります。カスタム属性がどのように動作するか、それらを使用して何ができるか、およびそれらを使用する方法を理解するために読むことをお勧めします。

于 2012-09-04T05:44:33.447 に答える