私は数時間問題を解決してきましたが、近いと思います。私は同じ方法を実行する50〜100種類を持つことができるアプリケーションに取り組んでいます。だからではなく、50-100クラスを作成するので、私はそれが一般的な作ってみました、これは私が持っているものである:これは、基本クラスである実行時に汎用インターフェイスを使用して汎用タイプを作成
:
public class RavenWriterBase<T> : IRavenWriter<T> where T : class, IDataEntity
そして、これはインターフェイスです:
public interface IRavenWriter<T>
{
int ExecutionIntervalInSeconds { get; }
void Execute(object stateInfo);
void Initialize(int executionIntervalInSeconds, Expression<Func<T, DateTime>> timeOrderByFunc);
}
そして、これは私がそれを使用している方法です:
private static void StartWriters()
{
Assembly assembly = typeof(IDataEntity).Assembly;
List<IDataEntity> dataEntities = ReflectionUtility.GetObjectsForAnInterface<IDataEntity>(assembly);
foreach (IDataEntity dataEntity in dataEntities)
{
Type dataEntityType = dataEntity.GetType();
Type ravenWriterType = typeof(RavenWriterBase<>).MakeGenericType(dataEntityType);
Expression<Func<IDataEntity, DateTime>> func = x => x.CicReadTime;
// This is where I'm stuck. How do I activate this as RavenWriterBase<T>?
var ravenWriter = Activator.CreateInstance(ravenWriterType);
//ravenWriter.Initialize(60, func); // I can't do this until I cast.
// More functionality here (not part of this issue)
}
}
私は上からこの行にこだわっている:
var ravenWriter = Activator.CreateInstance(ravenWriterType);
これが私の質問です:
にはどうすればRavenWriterBaseまたはIRavenWriterとすることを使用することができますか?ような何か:
ravenWriter.Initialize(60, func);
私はそれがこのようなものにする必要があると思いますが、私はIRavenWriter <のための型を指定する必要があります>と、私はまだそれを知らない:
var ravenWriter = Activator.CreateInstance(ravenWriterType) as IRavenWriter<>;
もし私がravenWriter上にカーソルを移動、私は正常に私のオブジェクトがあります。
をしかし、今、私は一般的な方法でそれを使用できるようにする必要があります。どうやってやるの?
更新:
私はちょうどdynamicキーワードを使用して考えると、これは動作します:
dynamic ravenWriter = Activator.CreateInstance(ravenWriterType);
ravenWriter.Initialize(60);
私はfuncは各IDataEntityのために同じであったことに気づいたので、私はそう、少しだまさInitialize()にパラメータとして渡す必要はありませんでした。しかし、少なくとも今では私はを呼び出すInitialize()。しかし、Funcが同じになったので、汎用インターフェースも必要ないはずです。
ジェネリックの不適切な使用のように聞こえます。さまざまな型に基づいて異なるメソッドを実行する必要があるが、実行時にしか型がわからない場合は、多態性を使用する必要があります。ジェネリックスはあなたを獲得していますか?最初にジェネリックスなしで、つまりIDataEntityを使用してメソッドをそのまま実行できますか? – mellamokb
私はmellamokbに同意します。しかし、ジェネリックスに設定されている場合、非genarをインスタンス化できるラッパークラスを作成しないでください。ラッパーには、引数として渡される型に応じて、RavenWriterBaseのインスタンスを返すメソッドが必要です。次に、ラッパーをインスタンス化し、要求されたdタイプをパラメーターとしてメソッドを呼び出します。これには、大きなswitch文が必要ですが、少なくとも200個の異なるクラスが必要です。 –
dcow
IDataEntity for Tを使用しない他の式を作成しますか?またはTは常にIDataEntityですか?そして、Tが常にIDataEntityなら、なぜジェネリックを使うのですか? –