7

これが機能しないことはわかっていますが、機能させる方法はありますか?

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

編集:

現在のコードは次のとおりです

私が合理化しようとしている方法は SingleNodeCollection です

ご覧のとおり、現在、非常にハックされたリフレクション メソッドを使用しています。

4

8 に答える 8

10

明らかな解決策が欠けているようです:

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

動的ルートが本当に必要な場合は、次のようにすることができます。

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});
于 2009-06-04T16:08:20.770 に答える
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;
}
于 2009-06-04T16:13:23.000 に答える
1

反省が必要です:

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

ジェネリックでも実行できますが、それは少しトリッキーです。

于 2009-06-04T16:09:03.563 に答える
0

より高速なのは、Reflection.Emitを使用すること です。これは、実行時に任意の具象型をインスタンス化するためにReflection.Emitを使用する簡単な例です目的のために、例のようにT.ctorではなくListのctorを呼び出す必要があります。

于 2009-06-04T16:22:45.230 に答える
0
  public class myClass
  {
  }

  myClass instance = new myClass();

  Type t = instance.GetType;

//top は、型の取得を示すためのものです...

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
于 2011-04-29T16:21:49.200 に答える
0
object obj = new object();
Type objType = obj.GetType();
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType));
list.Add(obj);

これにより、objType から割り当てられないものをリストに入れようとすると、ランタイム エラーが発生します。

于 2009-06-04T16:15:48.243 に答える
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?
}
于 2009-07-02T21:57:39.573 に答える
-2

あなたが何をしようとしているのか完全にはわかりませんが、これはうまくいくでしょうか:

var obj = new MyType();

私はあなたの質問を誤解しているかもしれません。

(これを編集して、コンパイルできないサンプルコードを修正しました。コメントをありがとう)

于 2009-06-04T16:18:17.417 に答える