如何在不指定通用参数的情况下将实现实例转换为接口(实现知道)?
How to cast implementation instance to interface without specifying generic argument (the implementation knows it)?
我有一个接口:
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
}
}
Class 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 稍后作为一个 Task,当 fce1 提供结果时 fce2 作为第二个 Task(这是简单的情况)。
我用 .NET 4.7 试过了
我知道可以 return 来自 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直接声明的持续时间。谢谢
我有一个接口:
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
}
}
Class 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 稍后作为一个 Task,当 fce1 提供结果时 fce2 作为第二个 Task(这是简单的情况)。
我用 .NET 4.7 试过了
我知道可以 return 来自 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直接声明的持续时间。谢谢