1

C#4.0。属性を持つ遅いプロパティがあります。ゲッターを呼び出さずにこの属性を読みたい:

[Range(0.0f, 1000.0f)]
public float X
{
    get
    {
        return SlowFunctionX();
    }
}

これは私が今持っているものです:

public static T GetRangeMin<T>(T value)
{
    var attribute = value.GetType()
        .GetField(value.ToString())
        .GetCustomAttributes(typeof(RangeAttribute), false)
        .SingleOrDefault() as RangeAttribute;

    return (T)attribute.Minimum;
}

var min = GetRangeMin<double>(X); // Will call the getter of X :(

Q:のゲッターを呼び出さずにこの属性を読み取るにはどうすればよいXですか?

4

2 に答える 2

9

プロパティの属性を読み取るには、属性を直接ロードするだけです

var attrib = typeof(TheTypeContainingX)
  .GetProperty("X")
  .GetCustomAttributes(typeof(RangeAttribute), false)
  .Cast<RangeAttribute>()
  .FirstOrDefault();
return attrib.Minimum;
于 2013-03-25T17:03:06.577 に答える
1

とにかくそのように取得することはできません。これは、のようなものを呼び出すことGetRangeMin<float>(0.0f)になり、floatタイプにはwhatever-value-X-hasというフィールドがないためです。

一般的でタイプセーフな方法でそれを実行したい場合は、式を使用する必要があります。

public static T GetRangeMin<T>(Expression<Func<T>> value)

このように呼び出されます:

var min = GetRangeMin(() => X);

次に、式ツリーをナビゲートしてプロパティ情報を取得する必要があります

MemberExpression memberExpression = value.Body as MemberExpression;
if (null == memberExpression || memberExpression.Member.MemberType != MemberTypes.Property)
    throw new ArgumentException("Expect a field access", "FieldExpression");
PropertyInfo propInfo = (PropertyInfo)memberExpression.Member;

今、あなたはすることができGetCustomAttributesますpropInfo。余談ですが、相続が気になる場合は、頼んでも相続ツリーを歩かないAttribute.GetCustomAttributes(propInfo, ...)ので、使う必要があるかもしれません。propInfo.GetCustomAttributes(...)

于 2013-03-25T17:06:15.143 に答える