在运行时知道通用类型的类型参数时如何编程?

时间:2018-07-13 06:12:15

标签: c# generics reflection

我有一个使用通用类型的api的数据存储代码库,因此用户可以针对KeyValue进行良好的编程。

例如

db.AddAsync<Key,Value>(Key k, Value v)
DBEnumerator<Key,Value> db.GetAsyncEnumerator<Key,Value>()

现在,对于某些功能,我们在运行时从另一个dll中加载了这些KeyValue类型。所以,我有

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>,其中KeykeyType的值,而ValuevalueType的值?

我有50多行,我不想一直使用反射。 在这种情况下,最佳做法和帮助方法是什么?

1 个答案:

答案 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 */
}