【发布时间】: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