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

问题描述 投票:3回答:1

我有一个界面:

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返回对象,然后将其转换为所需的类型并对其进行处理吗?但这是唯一的方法吗?我想避免投射。

我有一个接口:公用接口IA {T fce1(float [] data); byte [] fce2(T arg); },并且我有指定特定T的实现(因此实现可以执行...

c# generics interface .net-assembly activator
1个回答
0
投票

使用动态类型,可以进行方法调用(只有第一次调用需要很长时间,然后效率很高。)>

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[];
}
© www.soinside.com 2019 - 2024. All rights reserved.