CSharp拡張方法応用の取得特性

7120 ワード

例えばAsp.NetMVC Webアプリケーションでは、あるアクションにAttributeがあるかどうかを素早く知りたいです.このような拡張方法を使用することができます.
/// <summary>
/// Gets the method.
/// </summary>
/// <typeparam name="T">Type</typeparam>
/// <param name="instance">The instance.</param>
/// <param name="methodSelector">The method selector.</param>
/// <returns>MethodInfo</returns>
public static MethodInfo GetMethod<T>(this T instance, Expression<Func<T, object>> methodSelector)
{
    // it is not work all method
    return ((MethodCallExpression)methodSelector.Body).Method;
}

/// <summary>
/// Gets the method.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="instance">The instance.</param>
/// <param name="methodSelector">The method selector.</param>
/// <returns>MethodInfo</returns>
public static MethodInfo GetMethod<T>(this T instance,
    Expression<Action<T>> methodSelector)
{
    return ((MethodCallExpression)methodSelector.Body).Method;
}

/// <summary>
/// Determines whether the specified member has attribute.
/// </summary>
/// <typeparam name="TAttribute">The type of the attribute.</typeparam>
/// <param name="member">The member.</param>
/// <returns>
///   <c>true</c> if the specified member has attribute; otherwise, <c>false</c>.
/// </returns>
public static bool HasAttribute<TAttribute>(
    this MemberInfo member)
    where TAttribute : Attribute
{
    return GetAttributes<TAttribute>(member).Length > 0;
}

/// <summary>
/// Gets the attributes.
/// </summary>
/// <typeparam name="TAttribute">The type of the attribute.</typeparam>
/// <param name="member">The member.</param>
/// <returns></returns>
public static TAttribute[] GetAttributes<TAttribute>(
    this MemberInfo member)
    where TAttribute : Attribute
{
    var attributes =
        member.GetCustomAttributes(typeof(TAttribute), true);

    return (TAttribute[])attributes;
}

使用方法は、次のコードを参照してください.lambda式を使用してメソッドを取得し、その上のAttributeを取得します.
[Fact]
public void GetHttpPostAttributeFromCreateAction()
{
    // Arrange
    var controller = GetEmployeeController(new MemeoryEmployeeBoService());
    
    //Act
    bool hasPostAttribute =controller.GetMethod(e => e.Create(new Employee()))
        .HasAttribute<HttpPostAttribute>();

    // Assert
    Assert.True(hasPostAttribute);
}

開発に役立つことを願っています.
興味のある記事:
拡張メソッドを使用してEnumタイプにビジネスロジックを追加 IDataReaderインタフェースを拡張方法で拡張 IEnumerable<T>にCombineを追加する拡張方法 拡張メソッドによる分割文字列の生成 Orderbyの拡張方法
作者:Petter Liu出典:http://www.cnblogs.com/wintersun/本文の著作権は作者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.この記事は、私の独立したブログにも掲載されています.Petter Liu Blog.