2016-08-04 3 views
2

私はリファレンス文字列として渡された名前でC#のオブジェクトフィールド

ユーザーは彼らが見たいフィールドのリストを定義することができますC#でASP.NET MVCを使用してカスタムrepotingモジュールを書いていますレポート。

文字列を使用してオブジェクトフィールドを参照できるかどうかを知りたいので、選択したフィールドのリストを列挙できます。ビューでは通常例えば

、非常に基本的に私はドンので、私は、ASPで経験していないよ、私は

@foreach (Title item in Model) 
{ 
    @item.Select("Name") 
    @item.Select("Isbn") 
} 
+0

さて、実際に試してみて、それが可能かどうかを調べることができます。馬鹿にしようとはしませんが、私は実際にはここでの質問を見ません。 – uTeisT

+0

[.NET Frameworkのリフレクション](https://msdn.microsoft.com/fi-fi/library/f7ykdhsy)aspx) – Fabio

答えて

1

これを行う方法の1つは、反映を介したものです。どこかで、このヘルパーメソッドを追加します。

private object GetValueByPropertyName<T>(T obj, string propertyName) 
{ 
    PropertyInfo propInfo = typeof(T).GetProperty(propertyName); 

    return propInfo.GetValue(obj); 
} 

は使用法:それはMVCパターンの主な原則を破るよう

@foreach (Title item in Model) 
{ 
    var name = GetValueByPropertyName(item, "Name"); 
    var isbn = GetValueByPropertyName(item, "Isbn"); 
} 
+0

ありがとう、私は "反射"を検索することを選択することは知られていないだろう – Frazer

0

のようなものを探していることになる次

@foreach (Title item in Model) 
{ 
    @item.Name 
    @item.Isbn 
} 

を行うだろうこれがあなたの特定の状況で可能なのかどうかは確かに分かりません。

しかし、通常はリフレクションを使用できます。プロパティの場合

FieldInfo fi = item.GetType().GetField("Name", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
var value = fi.GetValue(item); // read a field 
fi.SetValue(item, value); // set a field 

:しかし、あなたはプロパティまたはフィールドフィールドの場合

を探しているかどうかを知る必要があったためにGoogleに

PropertyInfo pi = item.GetType().GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
var value = pi.GetValue(item); // read a property 
pi.SetValue(item, value); // set a property 

単語 "リフレクション" でありますほとんどの方法はTypeクラスにあります。

0

さて、私は強くビューでリフレクションを使用してに対してをお勧めします。はい、反射を使用する必要がありますが、コントローラで使用する方が良いです。シンプルで実用的な例を見てみましょう。

コントローラでは、動作するスタブデータを設定しました。

class Title 
{ 
    // ctor that generates stub data 
    public Title() 
    { 
     Func<string> f =() => new string(Guid.NewGuid().ToString().Take(5).ToArray()); 
     A = "A : " + f(); 
     B = "B : " + f(); 
     C = "C : " + f(); 
     D = "D : " + f(); 
    } 

    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 
    public string D { get; set; } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult About() 
    { 
     var data = new List<Title>() 
     { 
      new Title(), new Title(), 
      new Title(), new Title() 
     }; 

     // list of properties to display for user 
     var fieldsSelectedByUser = new[] { "A", "C" }; 

     // here we obtain a list of propertyinfos from Title class, that user requested 
     var propsInfo = typeof(Title).GetProperties().Where(p => fieldsSelectedByUser.Any(z => z == p.Name)).ToList(); 

     // query that returns list of properties in List<List<object>> format 
     var result = data.Select(t => propsInfo.Select(pi => pi.GetValue(t, null)).ToList()).ToList(); 

     return View(result); 
    } 

    ... 
} 

とビューで、我々は単にコレクションを反復することによって、それを使用することができます:そして、()についてアクションメソッドでは、我々は、ユーザが選択したプロパティの動的なリストを取得

@model List<List<object>> 

<br/><br /> 

@foreach (var list in @Model) 
{ 
    foreach (var property in list) 
    { 
     <p> @property&nbsp;&nbsp;</p> 
    } 

    <br/><br /> 
} 

P.S.

MVCパターンによると、ビューはコントローラから返されたデータを利用するべきですが、決してビジネスロジックとその内部の包括的な操作を実行するべきではありません。ビューに何らかのフォーマットのデータが必要な場合は、コントローラが必要とするフォーマットでこのデータを正確に返す必要があります。

関連する問題