4つのプロパティを含むクラスがあります。
class MyClass
{
public int i{get;set;}
public double d{get;set;}
public string s{get;set;}
public char c{get;set;}
}
そしてこのクラスのリスト:
var lstSource = new List<MyClass>
{
new MyClass {i = 1, d = 1.2, s = "s1", c = '1'},
new MyClass {i = 2, d = 2.2, s = "s2", c = '2'},
new MyClass {i = 3, d = 3.2, s = "s3", c = '3'}
};
次に、エンドユーザーからこれらのプロパティのいくつかの名前を取得し、必要なプロパティを含む匿名タイプのリストを取得します。ユーザーは、必要なプロパティのリストを文字列のコレクション(必要なプロパティの名前)として提供します。たとえば、必要なプロパティのリストが次のようになっているとします。
var wantedProperties = new List<string> {"i", "s"};
問題1:これらのプロパティのみをから取得するにはどうすればよいlstSource
ですか?
問題2:匿名リストの新しい変数としてすべてのプロパティのタイプを提供するにはどうすればよいですか?「wantedProperties」のすべてのアイテムについて、結果リストに別の変数を追加します。必要なプロパティのタイプを示します。この例では、結果のリストは次のようになります。
{
{WantedProperty1_Value = 1,WantedProperty1_Type = typeof(int)},
{WantedProperty2_Value = 2,WantedProperty2_Type = typeof(string)}
}
まず、MyClass
プロパティではなくフィールドがあります。public int i {get; set;}
たとえば、これらをに変更する必要があります。
これで、リフレクションを使用して、名前で識別されるプロパティの値とタイプを取得できます。
foreach(MyClass obj in lstSource)
{
foreach(string propertyName in wantedProperties)
{
PropertyInfo property = typeof(MyClass).GetProperty(propertyName);
object value = property.GetValue(obj);
Type propertyType = property.PropertyType;
}
}
プロパティが公開されていない場合は、の別のオーバーロードをGetProperty
使用して、BindingFlags.NonPublic | BindingFlags.Instance
バインディングフラグを使用する必要があります。
今、あなたがしなければならないのは結果セットを構築することです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加