本文位址:http://www.cnblogs.com/outtamyhead/p/3616913.html,轉載請保留本位址!
最近在項目遇到了這個問題:擷取Action行參中實體類的屬性值,主要的邏輯是加入一個全局過濾器,從ACTION參數中截取實體類并獲得它裡面的内容。經過在網上以及園子裡找資料,沒有查到相關内容,但是也零零碎碎的獲得了很多有用的資訊。
過濾器主要包含四種:Authorization、Action、Result、Exception,分别對應的接口是:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,分别的解釋依次是:授權過濾器接口、動作過濾器接口、結果過濾器接口、異常過濾器接口。
因為我是要在Action中擷取到實體類的内容,是以我重寫了OnActionExection()方法。
namespace CMPCommon
{
public class LogRecordFilterAttribute : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//base.OnActionExecuting(filterContext);
}
}
}
LogRecordFilterAttribute繼承了Controller。如果你了解Controller就應該知道它的繼承關系是怎樣的。
public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter
當然,LogRecordFilterAttribute也可以單獨實作IActionFilter接口。現在大體上的思路有了,但是如何擷取到實體類并擷取它的屬性以及Value呢?通過翻閱ActionExecutingContext的定義,發現了它的一個屬性:ActionParameters。這個屬性的解釋是:擷取或設定操作-方法參數。這就意味着我可以通過這個屬性得到我想要的東西。下面看這個屬性的定義:
public virtual IDictionary<string, Object> ActionParameters { get; set; }
這個屬性傳回了一個字典,也就是鍵值格式。那麼我就可以先通過擷取它的Key,然後根據Key去取對應的Value就可以了。
int parametersCount=filterContext.ActionParameters.Count;
if ( parametersCount > 0)
{
var keys = filterContext.ActionParameters.Keys;
if (null != keys)
{
foreach (string key in keys)
{
var value = filterContext.ActionParameters[key];
if (null == value)
continue;
}
}
}
}
通過上面的代碼,我就擷取到了Action中參數的内容。但是問題又來了,如果我獲得的是一個實體類,那麼怎麼得到它的屬性值呢?通過在園子裡遊蕩,結合自己的想法,得到了下面的代碼:
if (value.GetType().IsClass && value.GetType().Name != "String")
{
object objClass = value;
PropertyInfo[] infos = objClass.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
if (info.CanRead)
{
Console.WriteLine(info.Name + "=" + info.GetValue(objClass, null));
}
}
}
首先要了解的是,filterContext.ActionParameters[key]傳回的是object,是以我可以通過object的GetType()方法擷取到它的類型,并對該類型進行判斷。當然,上方if()判斷不是太全面。然後通過GetProperties()方法擷取裡面的屬性,然後通過GetValue()方法獲得屬性值。
至此,我已經将Action行參中包含實體類的屬性值取出來了。如果大家有比較好的方法和方式,歡迎留言讨論,如果覺得不錯,請猛戳“推薦”!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CM0IDM4EjMwQDMzEDMyUmYlIWOlUTZlEWYlgDOlYTZlEVUf92LcZTN1YjN08CXkFWZolXbhRHd192Lc12bj91cn9Gbi52YvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
文章作者:禁止吸煙
道本無話可說,皆當全力以赴。
部落格位址:http://www.cnblogs.com/outtamyhead/