私はここ数時間問題に取り組んできました、そして私は近いと思います。私は、同じように機能する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が同じになったので、ジェネリックインターフェイスも必要ありません。