2

私には2つのクラスがあります:

  class Car<T>
{
    public string color { get; set; }
    public virtual T features { get; set; }
    public virtual void TestDrive();
}
class Toyota : Car<ToyotaFeatures>
{
    public override ToyotaFeatures features { get; set; }
    public override void TestDrive()
    {
        //Logic here...
    }
}

これで、完全な文字列クラス名が作成されました。「MySol.MyProj.Toyota」
文字列名でクラスをインスタンス化してから、TestDrive()を実行します。
問題は、実行しようとするとActivator.CreateInstance(null, "MySol.MyProj.Toyota");
、ToyotaFeaturesクラスが渡されることを期待しているため、基本クラスにキャストしてtestDriveを実行できないことです。しかし、文字列クラス名のみを持つTestDrive()を実行したいだけです。

そして、私はそれを特定のタイプにキャストしたくありません。提供された文字列に基づいて実行するTestDrive()を決定できるように、基本タイプのみに適用されます。

4

4 に答える 4

3

その目的のために、インターフェースは非常に優れています。

interface ITestDrivable
{
    void TestDrive();
}

抽象クラスはインターフェースを実装します:

class Car<T> : ITestDrivable
{
    public string Color { get; set; }
    public virtual T Features { get; set; }
    public abstract void TestDrive() { }
}

そして、キャストは非常に簡単です。

ITestDrivable car = (ITestDrivable)Activator.CreateInstance(null, "MySol.MyProj.Toyota");
car.TestDrive();
于 2012-10-16T12:29:25.947 に答える
3
Type type = Type.GetType("MySol.MyProj.Toyota");

var obj = Activator.CreateInstance(type);
type.GetMethod("TestDrive").Invoke(obj, null);
于 2012-10-16T12:33:45.533 に答える
0

クラスにインターフェイスIConvertibleを実装してから、 Convert.ChangeType(..)メソッドを使用する必要があります。コードサンプルは次のようになります。

   // hords the created object
   object createdByActivator = ....;
   Car objectAsCar = Convert.ChangeType(createdByActivator, Type.GetType("MySol.MyProj.Toyota"

)。

于 2012-10-16T12:47:00.187 に答える
0

それは意味がありますか:

abstract class CarFeatures { }

class ToyotaFeatures : CarFeatures { }

abstract class Car
{
    public string color { get; set; }
    public virtual void TestDrive() { }
}

abstract class Car<T> : Car where T : CarFeatures
{
    public virtual T features { get; set; }

    public Car(T _features)
    {
        features = _features;
    }
}

class Toyota : Car<ToyotaFeatures>
{
    public override ToyotaFeatures features { get; set; }

    public Toyota(ToyotaFeatures _features) : base(_features) { }

    public override void TestDrive()
    {
        //Logic here...
    }
}

ジェネリッククラスを非ジェネリッククラスから派生させて、ジェネリックに依存しないすべての一般的なメソッドとフィールドを配置し、それらに簡単にアクセスできるようにしました。

ToyotaFeatures features = new ToyotaFeatures();
Car car = (Car)Activator.CreateInstance(typeof(Toyota), new object[] { features });
car.TestDrive();

しかし、誰かがより良い解決策を持っているなら、私も興味をそそられるでしょう。

編集:上記のように、インターフェースはかっこいいですが、私の経験則は「1つのクラスだけに使用する場合はインターフェースを作成しないでください」です。しかし、それは機能します。

再編集:問題は、パラメータのコレクションを使用して汎用オブジェクトをインスタンス化することでした。

于 2012-10-16T12:34:48.727 に答える