2009-06-04 10 views
7

これはうまくいかないことは知っていますが、誰かがそれを動作させる方法がありますか?Cの動的型入力

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
Type objType = typObj.GetType(); 
List<objType> list = new List<objType>(); 
list.add((objType) obj); 

編集:ここでは

が現在のコードです:あなたが見ることができるように、私は合理化しようとしてるhttp://github.com/vimae/Nisme/blob/4aa18943214a7fd4ec6585384d167b10f0f81029/Lala.API/XmlParser.cs

方法はSingleNodeCollection

で、それが現在そうリフレクションを一緒にハッキング使用しますメソッド。あなたが反射を必要とする

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
Type objType = typObj.GetType(); 

Type listType = typeof(List<>); 
Type creatableList = listType.MakeGenericType(objType); 

object list = Activator.CreateInstance(creatableList); 
MethodInfo mi = creatableList.GetMethod("Add"); 
mi.Invoke(list, new object[] {obj}); 
+2

何あなたのやろうとしていますか? –

+0

あなたは何を達成しようとしていますか? –

+2

ダニエル:彼はすでに存在するオブジェクトのタイプのリストを作成しようとしているようです。 – Welbog

答えて

10

は、あなたが明白な解決策が欠けているようだ

constructor = typeof (MyType).GetConstructor() // doing this from memory, the typeof might be wrong, I'm sure someone will edit it 
typObj = (MyType) constructor.Invoke() 

これはジェネリック向けに行うこともできますが、これはやや難解です。

+0

これは.NET 3.5でのみですか? – Skizz

+0

いいえ、2.0以上。 –

+0

コードの素敵なビット、ちょうど私の問題を解決しました。 :) –

1

:あなたは本当にダイナミックルートが必要な場合は

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
List<MyType> list = new List<MyType>(); 
list.Add((MyType) obj); 

は、その後、あなたはこのような何かを行うことができます:

1

ジェネリックスを使用してこのようなことをすることはできますが、私はそれが何であるのかは分かりません。これにより

public List<T> TypedList<T>() where T : new() 
{ 
    object obj = new object(); 
    T typObj = new T(); 
    obj = typObj; 
    List<T> list = new List<T>(); 
    list.Add((T)obj); 
    return list; 
} 
0
object obj = new object(); 
Type objType = obj.GetType(); 
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType)); 
list.Add(obj); 

あなたがOBJTYPEから割り当て可能ではないリストに何かを置くしようとすると、ランタイムエラーを取得します。

-2

私は何をしようとする全くわからないんだけど、この作品は希望:

var obj = new MyType();

私もあなたの質問を誤解される可能性があります。

(私は、コンパイルされないであろうサンプルコードを修正するコメントをおかげで、これを編集)

+0

var obj;無効な宣言です。 varは暗黙的なキーワードです。つまり、コンパイラがその型を判別します。ステートメントvar obj;コンパイラは型を決定するのに十分な情報を持っていないでしょう。 –

0

高速任意コンクリートをインスタンス化するためReflection.Emit Here's Reflection.Emitを使用する単純な例を使用することであろう実行時にタイプします。あなたの目的のためには、例のようにT.ctorの代わりにListのctorを呼び出さなければなりません。

0

それが答えたようだにもかかわらず、私はまだそれを得ることはありません:)

は、関数への一般的な引数として「typeToReturn」を持っていることが有用ではないでしょうか?

public List<T> SingleNodeCollection<T>(String xPath, XPathNavigator navigator) 
    where T : new() 
{ 
    XPathNodeIterator nodes = navigator.Select(xPath); 
    List<T> returnedList = new List<T>(nodes.Count); 
    ... 
    T newObj = new T(); 
    ... 
    Type t = typeof(T); // need the type anyway? 
} 
0
public class myClass 
    { 
    } 

    myClass instance = new myClass(); 

    Type t = instance.GetType; 

//トップは...ただのタイプを取得し表示するために

public object GetListOfType(Type t) 
{ 
    Type listType = typeof(List<>); 
    var listOfType = listType.MakeGenericType(t); 

    var listOfMyClassInstance = Activator.CreateInstance(listOfType); 

    return listOfMyClassInstance; 
} 

であるが、最終的にあなたはキャストする必要が...あなたのタイプを使用して直接

List<object> listOfMyClass = GetListOfType(t); 
    listOfMyClass.Add(myClassInstance); 

    ((myClass)listOfMyClass[0]).SomeProperty 
関連する問題