2012-04-19 68 views
1

我問類似的問題herehere獲取屬性名稱和類型傳遞直接

這是一個樣本類型:

public class Product { 

    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Category { get; set; } 
    public bool IsAllowed { get; set; } 

} 

而且我有需要的屬性生成一些HTML代碼的通用類:

public class Generator<T> { 

    public T MainType { get; set; } 
    public List<string> SelectedProperties { get; set; } 

    public string Generate() { 

     Dictionary<string, PropertyInfo> props; 
     props = typeof(T) 
       .GetProperties() 
       .ToDictionary<PropertyInfo, string>(prop => prop.Name); 

     Type propType = null; 
     string propName = ""; 
     foreach(string item in SelectedProperties) { 
      if(props.Keys.Contains(item)) { 
       propType = props[item].PropertyType; 
       propName = item; 

       // Generate Html by propName & propType 
      } 
     } 

而且我用這個類型如下:

Product pr = new Product(); 
Generator<Product> GT = new Generator<Product>(); 
GT.MainType = pr; 
GT.SelectedProperties = new List<string> { "Title", "IsAllowed" }; 

GT.Generate(); 

所以我認爲這個過程應該更容易,不過我不知道如何實現它,我想通過性能發電機更簡單,有點像以下僞代碼:

GT.SelectedProperties.Add(pr.Title); 
GT.SelectedProperties.Add(pr.IsAllowed); 

我不知道這是否可能,我只需要兩件事1-PropertyName like:IsAllowed 2-屬性類型如:bool。也許不需要通過MainType我使用它來獲取屬性類型,所以如果我可以像上面那樣處理,就不需要它了。

你有什麼建議來實現這樣的事情?

有沒有更好的方法來做到這一點?

更新

正如ArsenMkrt說我發現可以用MemberExpression,但我不能讓物業類型,我看到在調試物業類型看圖片:

enter image description here

那麼如何我可以獲得房產類型嗎?我發現它here

回答

4

您可以使用expression tree,比你的代碼看起來像這樣

GT.SelectedProperties.Add(p=>p.Title); 
GT.SelectedProperties.Add(p=>p.IsAllowed); 

您需要創建一個從列表導出SelectedProperties自定義集合類,並創建添加方法類似這樣的

//where T is the type of your class 
    public string Add<TProp>(Expression<Func<T, TProp>> expression) 
    { 
     var body = expression.Body as MemberExpression; 
     if (body == null) 
      throw new ArgumentException("'expression' should be a member expression"); 
     //Call List Add method with property name 
     Add(body.Member.Name); 
    } 

希望這有助於幫助

+0

感謝您的回答,這真的很有幫助,但我無法獲得'PropertyType',我在調試中看到屬性類型,但我不知道g等等,因爲我更新問題,你知道如何得到它嗎? – Saeid 2012-04-19 07:34:08

+0

@Saeid,我相信((PropertyInfo)body.Member).PropertyType將返回你正在尋找的類型 – 2012-04-19 09:03:15