【问题标题】:How to cast implementation instance to interface without specifying generic argument (the implementation knows it)?如何在不指定泛型参数的情况下将实现实例转换为接口(实现知道它)?
【发布时间】:2019-09-18 14:46:35
【问题描述】:

我有一个界面:

public interface IA<T>
{
     T fce1(float[] data);
     byte[] fce2(T arg);        
}

我有它的实现,它指定了某些 T(所以实现不需要其他任何东西):

public class A : IA<float>
{
   public float fce1(float[] data)
   {
       return 1f;//data processing
   }

   public byte[] fce2(float arg)
   {
       return BitConverter.GetBytes(arg);//some kind of serialization
   }        
}

A 类在 a.dll 中,我想获取它并调用 fce2(fce1())(所以应该没有未知的参数或类型。我想做以下事情:

var data = File.ReadAllBytes("a.dll") 
var assembly = Assembly.Load(data);
var expTypes = assembly.GetExportedTypes();

foreach (var d in assembly.GetExportedTypes())
{
     var obj = Activator.CreateInstance(d);
     if (obj is IA)
     {
          var kernel = obj as IA;
          kernel.fce2(fce1());
     }
}

目的是当fce1提供结果时,fce1作为一个Task稍后运行,fce2作为第二个Task运行(这是简单的情况)。

我在 .NET 4.7 上试过这个

我知道可以从 fce1 返回对象,然后在 fce2 中将对象转换为所需的类型并进行处理?但这是唯一的方法吗?我想避免强制转换。

【问题讨论】:

  • 我想避免强制转换” - 为什么?无论如何,您可以使用反射轻松实现这一点,这将允许您在编译时不明确知道类型的情况下动态调用方法
  • fc1() 是否与 fc2() 在同一个对象上被调用? fce2(fce1(float[])) 返回byte[]。这不是通用的。使用方法byte[] fc2fc1(float[]) 编写非泛型基接口。将新实例转换为该实例。或者你的意思是T fce1(float[] data);T fce1(T[] data);
  • @Martin 我也找到了一种使用动态类型的方法,也是一种方法。但是反射和动态的性能都很低。
  • @EdPlunkett 我希望这两种方法一分为二的原因是为了平衡 CPU 负载。想象一下 fce1 中的 float[] 输入数组是例如6M 的长度,每秒传入...fce1 应该处理数据,fce2 序列化结果。序列化可以独立完成,但是下一个float[]数据包只能在前一个数据包处理完后才能处理(因为传入的float[]数据只是连续时间序列中的一个块)......

标签: c# generics interface .net-assembly activator


【解决方案1】:

使用动态类型,可以进行方法调用(只是第一次调用时间长,效率很高。

float[] testingPacket = new float[6250000];
dynamic instance = null;

foreach (var d in assembly.GetExportedTypes())
{
    instance = Activator.CreateInstance(d);
}
int L = 0;
for (int i = 0; i < L; ++i)
{
    dynamic result1 = instance.fce1(testingPacket);
    byte[] buffer = instance.fce2(result1) as byte[];
}

L 越高,for 循环的持续时间越接近对象转换和使用 as IA 直接声明的持续时间。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多