13

この問題が発生しています。リフレクションを使用してクラスからプロパティを取得していますが、問題はリフレクションがそれらをオブジェクトとして返し、実際の型に取得できないことです。

たとえば、これがクラスの場合:

public class Row<T>
{
    public static explicit operator Row<object>(Row<T> o)
    {
        return new Row<object>
        {
            Name = o.Name,
            Value = o.Value
        };
    }

    public string Name { get; set; }

    public T Value { get; set; }
}

1つの発言Row<bool>からRow<object>機能へのキャスト:

    var a = new Row<bool>
    {
        Name = "Foo",
        Value = true
    };

    var b = (Row<object>)a; // Works

しかし、そこから行こうとobjectするRow<object>と、明示的な演算子が無視されて System.InvalidCastException がスローされるようです。

var c = (object) a; // Simulate getting from reflection

var d = (Row<object>) c; // System.InvalidCastException

私は何が欠けていますか?

4

3 に答える 3

4

ここでの問題は、キャストしようとしている値の静的型で定義されていない限り、キャストが変換演算子を検索しないことです。あなたの例では、の静的タイプはcisobjectでありobject、から派生したものでも変換演算子を持っていないためRow<object>、実行時例外が発生します。

この問題は、より良い設計で簡単に回避できるようです。

Row<T>の任意の型をとして扱いたい場合Row<object>、変換演算子は、これらの型が階層的に関連していないという事実を回避するだけです。では、それらを関連させて、そもそも問題を回避してみませんか?

例えば:

public abstract class Row
{
    public string Name { get; set; }

    public object Value { get; protected set; }
}

public class Row<T> : Row
{
    public new T Value
    { 
        get { return (T)base.Value; }
        set { base.Value = value; }
    }
}

これはあなたが望むことをするようです:

  • キャストの問題は解決されました。これは、任意の型をRow<T>基本クラス(初期設計でRowの責任を引き継ぐ) にキャストし、型に関係なく簡単にアクセスできるようになったためです。Row<object>NameValueValue
  • セッターは保護されているため、型の安全性を維持しながら、外部からaをキャストして make するRow.Valueことはできません。Row<int>RowValuestring
于 2013-08-29T09:06:56.040 に答える