我有一个使用通用类型的api的数据存储代码库,因此用户可以针对Key
和Value
进行良好的编程。
例如
db.AddAsync<Key,Value>(Key k, Value v)
DBEnumerator<Key,Value> db.GetAsyncEnumerator<Key,Value>()
现在,对于某些功能,我们在运行时从另一个dll中加载了这些Key
和Value
类型。所以,我有
string keyFullTypeName = this.keyTypeName, valueFullTypeName = this.valueTypeName;
if (!String.IsNullOrEmpty(this.dllPath))
{
Assembly assembly = Assembly.LoadFrom(this.dllPath);
Console.WriteLine("Loaded assembly : FullName: {0}", assembly.FullName);
keyFullTypeName += ", " + assembly.FullName;
valueFullTypeName += ", " + assembly.FullName;
}
Type keyType = Type.GetType(keyFullTypeName);
Type valueType = Type.GetType(valueFullTypeName);
var enumerator = db.GetType()
.GetMethod("GetAsyncEnumerator")
.MakeGenericMethod(new Type[] { keyType, valueType });
现在,如何将枚举器强制转换为DBEnumerator<Key,Value>
,其中Key
是keyType
的值,而Value
是valueType
的值?
我有50多行,我不想一直使用反射。 在这种情况下,最佳做法和帮助方法是什么?
答案 0 :(得分:1)
我会做这样的事情,以便在运行时进入强类型的情况。
void Main()
{
var keyType = typeof(string);
var valueType = typeof(int);
var method = this.GetType()
.GetMethod("RunMyGenericCode", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance)
.MakeGenericMethod(keyType, valueType);
method.Invoke(this, new [] { new DB() });
}
private void RunMyGenericCode<Key, Value>(DB db)
{
DBEnumerator<Key, Value> e = db.GetAsyncEnumerator<Key, Value>();
/* Now I'm strongly-typed */
}