CSharp拡張方法応用の取得特性
7120 ワード
例えばAsp.NetMVC Webアプリケーションでは、あるアクションにAttributeがあるかどうかを素早く知りたいです.このような拡張方法を使用することができます.
使用方法は、次のコードを参照してください.lambda式を使用してメソッドを取得し、その上のAttributeを取得します.
開発に役立つことを願っています.
興味のある記事:
拡張メソッドを使用してEnumタイプにビジネスロジックを追加 IDataReaderインタフェースを拡張方法で拡張 IEnumerable<T>にCombineを追加する拡張方法 拡張メソッドによる分割文字列の生成 Orderbyの拡張方法
作者:Petter Liu出典:http://www.cnblogs.com/wintersun/本文の著作権は作者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.この記事は、私の独立したブログにも掲載されています.Petter Liu Blog.
/// <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.