リフレクションと継承の問題c#

セドリック・ヴェルリンデ

リフレクションを使用して、構造体のすべての部分のMemberExpressionを決定しようとしています。これらは、問題を説明するためのオブジェクトの一部です。

public class Entity
{
    public Part FirstPart { get; set; }
}

public class Part
{
    public int Id { get; set; }
}

public class SubPart : Part
{
    public int ExtraProperty { get; set; }
}

すべてのコンポーネントのMemberExpressionを決定するために使用した関数は、次のオブジェクト構造で正常に機能します。

        Entity entity = new Entity() { FirstPart = new Part() { Id = 1 } };

機能は次のとおりです。

        var param = Expression.Parameter(entity.GetType());
        String[] childProperties = ("FirstPart.Id").Split('.');
        var propExpression = Expression.PropertyOrField(param, childProperties[0]);
        for (int i = 1; i < childProperties.Length; i++)
        {
            propExpression = Expression.PropertyOrField(propExpression, childProperties[i]);
        }

ただし、継承のため、これは次の場合は機能しません。

        Entity entity = new Entity() { FirstPart = new SubPart() { ExtraProperty = 1 } };

プロパティをたどるには、パスを「FirstPart.ExtraProperty」に変更する必要があります。

        var param = Expression.Parameter(entity.GetType());
        String[] childProperties = ("FirstPart.ExtraProperty").Split('.');
        var propExpression = Expression.PropertyOrField(param, childProperties[0]);
        for (int i = 1; i < childProperties.Length; i++)
        {
            propExpression = Expression.PropertyOrField(propExpression, childProperties[i]);
        }

エラーメッセージには、次のように記載されています。'ExtraProperty 'はPartのメンバーではありません。誰かがこの問題を克服する方法を知っていますか?

nejcs

できません。式は、コンパイル時ではなく実行時にコンパイルされるコードと考えてください。魔法はなく、同様のルールが適用されます(式は低レベルで制限が厳しいため、C#コードレベルで使用できる多くのシンタックスシュガーは式では使用できません)。つまり、entity.FirstPart.ExtraPropertyC#コードでは無効であるため、式でも有効ではありません。

明示的なキャストを挿入することもできますが、インスタンスは実際には型SubPartであると想定しているので、の代わりにFirstPart型のメンバーを定義してみませんかまたは、TypeIs式使用して型テストロジックを作成し、C#コードの場合と同じ方法でキャストすることもできますSubPartPart

編集:

問題を読み直したところ、実際に実装しようとしているのは、任意のオブジェクトに対するプロパティウォーカーであることがわかりました。したがって、TypeIs式は、テスト対象の型がコンパイル時に認識されている必要があるため、ここでは役に立ちません。しかし、あなたの場合、任意の追加プロパティを持つPartinFirstPartメンバーから派生し任意のクラスが存在する可能性があります。この場合、他のオプションはありませんが、各プロパティアクセスを1つずつ評価し、中間値から実際のタイプを取得します。例えば:

Entity entity = new Entity() { FirstPart = new SubPart() { ExtraProperty = 1 } };

object currentObjectInChain = entity;
String[] childProperties = ("FirstPart.ExtraProperty").Split('.');

foreach (var property in childProperties)
{
    if (currentObjectInChain == null)
    {
        throw new ArgumentException("Current value is null");
    }
    var type = currentObjectInChain.GetType();
    var param = Expression.Parameter(type);
    var lambda = Expression.Lambda(
        Expression.PropertyOrField(param, property),
        param).Compile(); // cache based on type and property name
    currentObjectInChain = lambda.DynamicInvoke(currentObjectInChain);
}

ループの終わりにcurrentObjectInChainあなたの値を保持します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++ポリモーフィック継承問題のエレガントなソリューション

分類Dev

C#インターフェイスと継承の問題

分類Dev

クラス継承とジェネリック型継承のあるC#コレクションでは、継承されたクラスを追加できません

分類Dev

Xamarin.iOSリンカーとリフレクションの問題

分類Dev

タイプが他のタイプを継承するC#リフレクション検索プロパティ

分類Dev

クラスと継承のコレクション

分類Dev

ArrayListのジェネリック型とインターフェイスの継承に関する問題

分類Dev

Javaリフレクションの問題

分類Dev

Hibernate / JPAリフレクションの問題

分類Dev

リフレクションJAVAの問題

分類Dev

C#ストロングネームアセンブリリフレクションロードインターフェイスキャストの問題

分類Dev

Javaのジェネリックスと継承の問題

分類Dev

再帰とリフレクションを使用したJSONシリアル化。(配列の問題)

分類Dev

Javaリフレクションのパフォーマンスの問題

分類Dev

複数のスレッドでのセマフォとクリティカルセクションの問題

分類Dev

子クラスごとのGrails継承MongoDbコレクション

分類Dev

Javaリフレクションを使用して継承された属性の名前/値を取得する

分類Dev

UWP / C#フレームナビゲーションの問題

分類Dev

継承と関連付けのシナリオからのDoctrineクエリの問題

分類Dev

C# デリゲートとリフレクション

分類Dev

マルチスレッドC#アプリケーションログファイルのロックの問題

分類Dev

基本クラスコンストラクターを呼び出さないC#での継承の問題

分類Dev

タイプ比較の問題(システムリフレクションから)

分類Dev

C#リフレクション-GetMethod

分類Dev

c#ジェネリックインターフェイスと継承

分類Dev

コレクション継承javavs groovy

分類Dev

Javaジェネリックとコレクションの問題

分類Dev

クラスファクトリメソッドを継承するサブクラスの問題(Objective-C)

分類Dev

ReSharper と C# リフレクション

Related 関連記事

  1. 1

    C ++ポリモーフィック継承問題のエレガントなソリューション

  2. 2

    C#インターフェイスと継承の問題

  3. 3

    クラス継承とジェネリック型継承のあるC#コレクションでは、継承されたクラスを追加できません

  4. 4

    Xamarin.iOSリンカーとリフレクションの問題

  5. 5

    タイプが他のタイプを継承するC#リフレクション検索プロパティ

  6. 6

    クラスと継承のコレクション

  7. 7

    ArrayListのジェネリック型とインターフェイスの継承に関する問題

  8. 8

    Javaリフレクションの問題

  9. 9

    Hibernate / JPAリフレクションの問題

  10. 10

    リフレクションJAVAの問題

  11. 11

    C#ストロングネームアセンブリリフレクションロードインターフェイスキャストの問題

  12. 12

    Javaのジェネリックスと継承の問題

  13. 13

    再帰とリフレクションを使用したJSONシリアル化。(配列の問題)

  14. 14

    Javaリフレクションのパフォーマンスの問題

  15. 15

    複数のスレッドでのセマフォとクリティカルセクションの問題

  16. 16

    子クラスごとのGrails継承MongoDbコレクション

  17. 17

    Javaリフレクションを使用して継承された属性の名前/値を取得する

  18. 18

    UWP / C#フレームナビゲーションの問題

  19. 19

    継承と関連付けのシナリオからのDoctrineクエリの問題

  20. 20

    C# デリゲートとリフレクション

  21. 21

    マルチスレッドC#アプリケーションログファイルのロックの問題

  22. 22

    基本クラスコンストラクターを呼び出さないC#での継承の問題

  23. 23

    タイプ比較の問題(システムリフレクションから)

  24. 24

    C#リフレクション-GetMethod

  25. 25

    c#ジェネリックインターフェイスと継承

  26. 26

    コレクション継承javavs groovy

  27. 27

    Javaジェネリックとコレクションの問題

  28. 28

    クラスファクトリメソッドを継承するサブクラスの問題(Objective-C)

  29. 29

    ReSharper と C# リフレクション

ホットタグ

アーカイブ