5

私はコントロールを持っています...任意のSystem.Windows.Forms.Control。たとえば、ラベル。

「有効」と呼ばれるプロパティのデフォルト値を見つけたいと思います(その点については、任意のプロパティにすることができます)。どうすればいいのですか?

1) この場合、ラベルがあります。プロパティ「Enabled」のラベルのデフォルト値は true です。

2) 実行時に、「Enabled」プロパティのデフォルト値を調べたいとします...どうすればわかりますか?

3) まず、私は自分のコントロール下にあるオブジェクトを持っています。そのオブジェクトから、「Enabled」プロパティの現在の値しか取得できませんが、DEFAULT 値は取得できません。

この質問に対する 1 つの考えられるアプローチは次のとおりです。

1) 実行時にコントロールのタイプを識別します。2) デフォルトのコンストラクターを使用して初期化します。3)関心のあるプロパティの値を見つけます(明らかにデフォルト値になります)。そこにデフォルト値があります。

しかし、この場合..私は自分のコントロールを事前に知りません。私が知っているのは、それがSystem.Windows.Forms.Controlからの任意のコントロールであるということだけです。では、どうすればそれを初期化してそのオブジェクトを取得できますか? 出来ますか?

代替ソリューション/より良いアプローチはありますか?

4

4 に答える 4

4

これはリフレクションを使用する良い機会です!これは、デフォルトのコンストラクター(public、パラメーターなし)を持つ任意のタイプの任意のプロパティのデフォルト値を取得する必要があるメソッドです。

public static object GetDefaultPropertyValue(Type type, string propertyName)
{
        if (type.GetConstructor(new Type[] { }) == null)
            throw new Exception(type + " doesn't have a default constructor, so there is no default instance to get a default property value from.");
        var obj = Activator.CreateInstance(type);
        return type.GetProperty(propertyName).GetValue(obj, new object[] { });
}

単一のタイプの倍数が存在する可能性のある多数のコントロールを使用してこれを行う場合は、反射がやや遅いため、タイプごとに結果をキャッシュすることをお勧めします。

于 2012-06-22T13:37:36.937 に答える
3

ジェネリックを使用して、(設計時に) 不明なオブジェクトをインスタンス化できます。

public class DefaultValueChecker<T> where T : System.Windows.Forms.Control, new()
{
    public bool DetermineDefaultValue() {
        var control = new T();
        return control.Enabled;
    }
}
于 2012-06-22T13:30:02.843 に答える
0

You can try using reflection and checking for DefaultValue attribute:

Type labelType = typeof(Label);
DefaultValueAttribute attr = (DefaultValueAttribute)labelType
    .GetProperty("AutoEllipsis")
    .GetCustomAttributes(typeof(Defaul tValueAttribute),true)
    .FirstOrDefault();
Console.WriteLine(attr.Value);

However, not all properties are annotated with this attribute, so not all default values can be obtained this way.

于 2012-06-22T13:46:31.903 に答える
0

これは一般的にはわかりません。デフォルト値は次のいずれかです。

  • ハードコードされた
  • (交換可能な) リソースに依存する
  • システム設定に依存

提案されたアプローチでは、せいぜいハードコードされた値を見つけることができます。ただし、それらが本当にハードコーディングされているかどうかを判断する方法はありません。

質問の 2 番目の部分については、リフレクションを使用して解決できます。Typeクラス (実行時の型情報) とActivatorクラス (実行時の型のインスタンス化) を見てください。

于 2012-06-22T13:30:05.170 に答える