c# - 如何在不指定通用参数的情况下将实现实例转换为接口(interface)(实现知道)?

标签 c# generics interface .net-assembly activator

我有一个界面:

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 提供结果时将 fce2 作为第二个任务运行(这是简单化的情况)。

我用 .NET 4.7 试过了

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

最佳答案

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

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 的持续时间。谢谢。

关于c# - 如何在不指定通用参数的情况下将实现实例转换为接口(interface)(实现知道)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57995520/

相关文章:

java - Java 泛型中的下界通配符

php - 动态语言中的接口(interface)有什么意义吗?

java - 抽象类与所有方法抽象和接口(interface)之间的区别?

c# - 构建成功但发布失败——此版本的Microsoft.AspNetCore.All只兼容netcoreapp2.2目标框架

c# - C# 中的++ 操作是原子的吗?

c# - System.Speech 使用哪种 WAV 格式?

delphi - 在Delphi中使用接口(interface)有哪些优点和缺点?

c# - 从C#代码运行Powershell脚本时无法识别Start-Process

ios - 如何扩展 RealmOptional 以在 Swift 中的 Float 上添加一个函数?

TypeScript:如何在不指定模板参数的情况下使用模板化类型?