これは私の最初の投稿であり、自分の問題に関連するトピックをある程度検索しましたが、適切な答えを見つけるのに多くの問題があります。
私の質問は非常に単純かもしれませんが、答えを出すのはそれほど簡単ではないかもしれないことを私は知っています。存在する場合。
そうは言っても、これは私の場合です。例として、次のように、クラスからプロパティを取得するために使用しているPropertyInfoオブジェクトの配列があります。
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
簡単そうですね。今私の問題はこれです:新しいPropertyInfoオブジェクトを作成し、それを配列に追加する方法は?
ユーザーがPropertyInfoの値を設定したいという他の投稿を見たことがありますが、それは私が必要としているものではありません。必要なのは、新しいPropertyInfoオブジェクトをその場で作成することです。ここで、使用可能なデータはNameとTypeのみです。
以前に投稿したテストケースは、私が達成しようとしていることのほんの一例にすぎません。私の本当の最終的な目標は、実際、このクラスに基づいて新しいPropertyInfoを作成できるようにすることです。
public class DynamicClass
{
public Type ObjectType { get; set; }
public List<string> PropertyNameList { get; set; }
public List<Type> PropertyTypeList { get; set; }
}
誰かが私がこれを達成するのを手伝ってくれることを願っています。よろしくお願いします!
編集:GetProperties()メソッドの前にo.GetType()を追加するのを忘れました。イリヤ・イワノフに感謝します!
私は次のようにメソッドSelectPropertiesを呼び出しています:
list = _queriable.Select(SelectProperties).ToList();
メソッドは次のようになります。
private Expression<Func<T, List<string>>> SelectProperties
{
get
{
return value => _properties.Select
(
prop => (prop.GetValue(value, new object[0]) ?? string.Empty).ToString()
).ToList();
}
}
よろしくお願いします、
ルイス
更新:
わかりました。280Z28のアドバイスに従い、新しいクラスでPropertyInfoを継承しています。さらに調査を行ったところ、MSDNで、GetValue、SetValue、GetAccessors、GetGetMethod、GetSetMethod、およびGetIndexParametersのメソッドをオーバーライドする必要があることがわかりました。
ただし、パラメーターを使用してbaseを呼び出そうとすると、「抽象メンバーを呼び出せません:'System.Reflection.PropertyInfo.GetAccessesors(bool)'」というエラーが表示されます。パラメータを指定せずにメソッドを呼び出そうとすると、エラーは表示されませんが、それは間違ったアプローチのように感じます。
これは私がこれまでに得たものです:
public override MethodInfo[] GetAccessors(bool nonPublic)
{
MethodInfo[] temp = base.GetAccessors(nonPublic);
return temp;
}
更新2:
わかりました、それはうまくいきませんでした。PropertyInfoまたはPropertyDescriptorのいずれかの派生クラスを実行しようとして数時間後、私はそのアプローチを実行しないことにしました。
代わりに、私は他の投稿を読んで別のアイデアを思いつきました。私の本当の問題は、私が通常読んでプロパティを取得するために使用するクラスが常に同じであるとは限らないという事実にあります。ですから、おそらく本当に必要なのは、動的クラスをその場で作成し、それからプロパティを取得する方法にすぎないことに気づきました。
ExpandoObjectやElasticObjectと呼ばれるものがあることを読みましたが、最終的に解決策を得るためにそれらを問題に適用する方法はまだよくわかりません。
さて、私が実際に行っているのはこれです->次のリンクに記載されているソリューションを使用しています:jQuery DataTables Plugin Meets C#。
これは、DBテーブルごとに異なる静的モデル/クラスがあることを前提としています。ただし、私の場合、2つのタイプの列があります。各DBテーブルクラスによって提供される列(別名基本列)と、適応ですでに動的に提供している追加の列です。
例:これがDBテーブルクラスの場合:
public class Table1
{
public int Field1;
public string Field2;
public string Field3;
}
次に、文字列型の「アクション」と呼ばれる追加の列を指定します。次に、DataTableParserクラスの_properties属性に次の情報が含まれている必要があります。
_properties[0] should be int32 Field1
_properties[1] should be String Field2
_properties[2] should be String Field3
_properties[3] should be String Action
そして正直に言うと、それが私に必要なすべてです!それ以上でもそれ以下でもありません!残りはすでに解析しています!
結局、DataTableParserクラスに渡されるオブジェクトとは異なる数の列(提供される)があるため、DataTableの並べ替えとフィルタリング中に常にエラーが発生します。
何か助けてください?ほんとうに必要だ!再度、感謝します。
よろしくお願いします、
ルイス