2016-10-12 3 views
0

私はオブジェクトを返すジェネリックメソッドを持っています。特定のシナリオでは、このオブジェクトをリストにしたいので、オブジェクトのリストプロパティにアクセスしたいと考えています。そのためには、オブジェクトをオブジェクト型に変換する必要があります。オブジェクトを型に変換するには?

私はデータ

object obj 

を持つオブジェクトを持っている私がしようとしています:

Type t = obj.GetType(); 

var t1 = (t)obj; 

をオブジェクト上のリストのプロパティにアクセスするために:私はどのように

Type t = obj.GetType(); 

    var t1 = (t)obj; 

    return t1.items.Tolist(); 

これを行う?

EDIT:

私はすでに例えばのようなタイプを知っているだろうとします。これは働くだろう

Type t = obj.GetType(); 

var t1 = (ApiResult<IEnumerable<AlarmLog>>)obj; 

return t1.Items.ToList(); 

が、タイプは、タイプを見つけ、それを変換して返すために探し不明とイムです私の望むリスト。使用

+0

はい、シナリオがあるので、これをオブジェクトにする必要があります。 – ThunD3eR

+0

あなたは実行できません。「タイプ」は実行時の概念です。キャストはコンパイル時のコンセプトです。 –

+0

ジェネリックまたは「ダイナミック」の使用を検討してください。 –

答えて

1
static bool TryCastAsList<T>(object input, out IList<T> output) 
{ 
    IEnumerable inputAsIEnumerable = input as IEnumerable; 
    if (inputAsIEnumerable != null) 
    { 
     output = inputAsIEnumerable.Cast<T>().ToList(); 
     return true; 
    } 
    else 
    { 
     output = null; 
     return false; 
    } 
} 

object o1 = new []{ 1, 2, 3, 4, 5 }; 
IList<int> l1; 
if (TryCastAsList(o1, out l1)) 
{ 
    int n = l1.First(); // 1 
} 

object o2 = new[] { "Hello", "World" }; 
IList<string> l2; 
if (TryCastAsList(o2, out l2)) 
{ 
    string s = l2.First(); // Hello 
} 

渡されたオブジェクトが列挙可能な場合、TryCastAsListは、それがfalseを返す他に、ジェネリック型Tとして、すべての要素をキャストし、trueを返します。

1

これは、ジェネリックメソッドの実装に問題があると思います。あなたは純粋にカスタムオブジェクトで作業している場合、インターフェイスはあなたの問題のすべてを解決するだろう:

public interface IMask {} 

public class MyObject : IMask {} 

public class Driver 
{ 
    public static void main(string[] args) 
    { 
     Driver d = new Driver(); 
     MyObject mo = d.SomeMethod(/*some param*/); 
    } 

    public IMask<T> SomeMethod(/*some param*/) where T : IMask 
    { 
     //some code 
     return new IMask(); 
    } 
} 

上記のスニペットは、カスタムクラスのために動作します。 IMaskを返すことで、そのインターフェイスから継承する型に安全にキャストできます。実際に作業を行うメソッドは、タイプIMaskのオブジェクトのみを受け入れ、タイプIMaskの汎用オブジェクトを返すという点で完全に一般的です。

.Netクラスで作業している場合、どのオブジェクトを返すのか、どのオブジェクトにキャストするのかが問題になります。あなたはListを挙げましたが、他の戻り値の型は何ですか?文字列とリストの間の変換は少し問題になる可能性があります。

A)カスタムオブジェクトにラップします。 または B)このロジックを作業方法に追加してください。

もっと具体的な方法でこれに答えるためには、より多くの情報が必要になるでしょう。

+0

助けてくれてありがとう。私には少し残忍すぎるかもしれませんが、良い試みです。 – ThunD3eR

関連する問題