5
sTypeName = ... //do some string stuff here to get the name of the type

/*
The Assembly.CreateInstance function returns a type
of System.object. I want to type cast it to 
the type whose name is sTypeName.

assembly.CreateInstance(sTypeName)

So, in effect I want to do something like:

*/

assembly.CreateInstance(sTypeName) as Type.GetType(sTypeName);

それ、どうやったら出来るの?そして、これが C# 2.0 であると仮定して、代入式の左側に何を取りますか。var キーワードがありません。

4

3 に答える 3

2

残念ながら、.NET で必要なことを行う方法はありません。

可能な部分的な解決策は次のとおりです。

  1. コンパイル時に型がわかっている場合 (実行時に文字列から作成しているため、可能性は低い)、単純にその型にキャストします。

    YourType t = (YourType)Activator.CreateInstance(sTypeName);
    
  2. 考えられるすべての型が特定の共通インターフェイスを実装することがわかっている場合は、代わりにそのインターフェイスにキャストできます。

    IYourInterface i = (IYourInterface)Activator.CreateInstance(sTypeName);
    

上記のいずれも実行できない場合は、残念ながら、object内省にとどまっています。

于 2010-04-15T09:08:10.683 に答える
2

通常、すべてのクラスを許可します。これを動的にインスタンス化し、共通のインターフェイスを実装しますIMyInterface。次のようにクラス名文字列からインスタンスを作成できます。

Assembly asm = Assembly.GetExecutingAssembly();
string classname = "MyNamespace.MyClass";
Type classtype = asm.GetType(classname);

// Constructor without parameters
IMyInterface instance = (IMyInterface)Activator.CreateInstance(classtype);

// With parameters (eg. first: string, second: int):
IMyInterface instance = (IMyInterface)Activator.CreateInstance(classtype, 
                        new object[]{
                            (object)"param1",
                            (object)5
                        });

共通のインターフェイスを持っていなくても、メソッドの名前 (文字列として) を知っている場合でも、次のようにメソッドを呼び出すことができます (プロパティ、イベントなどについては非常に似ています)。

object instance = Activator.CreateInstance(classtype);

int result = (int)classtype.GetMethod("TwoTimes").Invoke(instance, 
                        new object[] { 15 });
// result = 30

例のクラス:

namespace MyNamespace
{
    public class MyClass
    {
        public MyClass(string s, int i) { }

        public int TwoTimes(int i)
        {
            return i * 2;
        }
    }
}
于 2010-04-15T09:13:17.313 に答える
2

.

クラスでジェネリック メソッドを定義すると、次のようにキャストできます。

 public T Cast<T>(object obj)
 {
      return (T) obj;
 }

 string sTypename = "SomeClassName"; 
 MethodInfo cast = this.GetType().GetMethod("Cast");
 MethodInfo genericCast = cast.MakeGenericMethod(new Type[] { Type.GetType(sTypename) });
 Object castedValue = genericCast.Invoke(this, new object[] { instanceToBeCasted });

しかし、コードの作成時に実際の型がわからないという理由だけで、キャストされた値を実際の型の変数に格納できない場合、そのようなキャストのポイントは何だと思いますか?

于 2010-11-30T10:39:09.647 に答える