2016-10-31 5 views
-1

私はリフレクションを使って作業してきましたが、それはまだ私にはとても新しいものです。だから下の行が働く。これは、DataBlockOneのリストを返します実行時のキャスティングリストタイプC#リフレクション

var endResult =(List<DataBlockOne>)allData.GetType() 
.GetProperty("One") 
.GetValue(allData); 

しかし、私は実行時までmyTypeを知りません。だから私の考えは、返されたオブジェクトから型を取得し、その型をDataBlockOneのリストとしてキャストするコードです。

List<DataBlockOne> one = new List<DataBlockOne>(); 
one.Add(new DataBlockOne { id = 1 }); 

List<DataBlockTwo> two = new List<DataBlockTwo>(); 
two.Add(new DataBlockTwo { id = 2 }); 

AllData allData = new AllData 
{ 
    One = one, 
    Two = two 
}; 

var result = allData.GetType().GetProperty("One").GetValue(allData); 

Type thisType = result.GetType().GetGenericArguments().Single(); 

メモ以下のリストタイプはわかりません。私はちょうど私が私が混乱してる

if (endResult.Count > 0) 
{ 
    var search = endResult.Where(whereExpression); 
} 

(あなたが返されたオブジェクトをキャストしていない場合、これはエラーになります)ので、私は後でリストを検索することができますキャストする必要が

var endResult =(List<DataBlockOne>)allData.GetType() // this could be List<DataBlockTwo> as well as List<DataBlockOne> 
.GetProperty("One") 
.GetValue(allData); 

例としてDataBlockOneを使用しますクラスの型とリストで使用される型誰かが、実行時に型を取得し、それをリストの型として設定するために正しい方向に向けることができますか?

クラス定義:

public class AllData 
{ 
    public List<DataBlockOne> One { get; set; } 
    public List<DataBlockTwo> Two { get; set; } 
} 

public class DataBlockOne 
{ 
    public int id { get; set; } 
} 

public class DataBlockTwo 
{ 
    public int id { get; set; } 
} 
+2

'dataList'のコンパイル時の型は何でしょうか? –

+0

したがって、コンパイル時の特典は、実行時にしか知り得ないタイプにする必要がありますか?そこには矛盾のビットがあります –

+0

getDataはどのようなタイプを返しますか? – pm100

答えて

0

あなたはこのようなものが必要になる場合があります:

var endResult = Convert.ChangeType(allData.GetType().GetProperty("One").GetValue(allData), allData.GetType()); 

ちょうど推測は、2013年以来、C#で動作しませんでした、:)

0
を撮影しないでください

おそらく次のようなものが必要です:

static void Main(string[] args) 
{ 
    var one = new List<DataBlockBase>(); 
    one.Add(new DataBlockOne { Id = 1, CustomPropertyDataBlockOne = 314 }); 

    var two = new List<DataBlockBase>(); 
    two.Add(new DataBlockTwo { Id = 2, CustomPropertyDatablockTwo = long.MaxValue }); 

    AllData allData = new AllData 
    { 
     One = one, 
     Two = two 
    }; 

    #region Access Base Class Properties 
    var result = (DataBlockBase)allData.GetType().GetProperty("One").GetValue(allData); 
    var oneId = result.Id; 
    #endregion 

    #region Switch Into Custom Class Properties 
    if (result is DataBlockTwo) 
    { 
     var thisId = result.Id; 
     var thisCustomPropertyTwo = ((DataBlockTwo)result).CustomPropertyDatablockTwo; 
    } 

    if (result is DataBlockOne) 
    { 
     var thisId = result.Id; 
     var thisCustomPropertyOne = ((DataBlockOne)result).CustomPropertyDataBlockOne; 
    } 
    #endregion 


    Console.Read(); 
} 


public class AllData 
{ 
    public List<DataBlockBase> One { get; set; } 
    public List<DataBlockBase> Two { get; set; } 
} 

public class DataBlockOne : DataBlockBase 
{ 
    public int CustomPropertyDataBlockOne { get; set; } 
} 

public class DataBlockTwo : DataBlockBase 
{ 
    public long CustomPropertyDatablockTwo { get; set; } 
} 

public abstract class DataBlockBase 
{ 
    public int Id { get; set; } 
} 
+0

あなたの権利では、各クラスのケースを設定することができますが、それは私が避けようとしていたものです。したがって、なぜ私は実行時に型を取得しようとしていましたが、戻り値の型から、型としてハードコードの代わりに、型として渡していました。私はまだあなたがここに示している継承を探しています。 – Luk6e

+0

'dynamic'戻り値の型' dynamic result = allData.GetType()。GetProperty( "One")。GetValue(allData); 'を使うと、コンパイル時の型チェックをすべて失うことになります。 Jon Skeet氏は、「ダイナミックな型指定が必要なように聞こえるかもしれませんが、C#が静的型チェックを実行する方法について理解しておく必要があります。 GetType()。GetPropert()。GetValue()から返されたプロパティにアクセスするための唯一の方法は、それぞれのクラス(私の答えに表示されている)、または 'dynamic'です(' result.CustomPropertyDataBlockOne'など)。それをコンパイルしてください。 – Quantic

+0

申し訳ありません私は私の研究を開始し、私がそれを働かせたら私は戻ってみんなに知らせるでしょう。 – Luk6e

関連する問題