1。 我有一个带参数的类方法。
这个参数可以改变它可以是一个或两个。
我必须在运行时调用此方法。
我有参数信息。
我需要检查有多少参数以及它是什么类型然后需要调用它。
现在我手动传递2个值而不考虑parameterinfo。
2
调用方法返回一个具有一个属性的类对象。
这个类可以有任意数量的属性。
对此类的任何更改都不应影响我的调用方法。
我必须转换调用结果并获取属性值。 例 的 House.currentDay 将来可以添加更多属性
我有班级图书馆 与班级
namespace ReflectionCALlingproject
{
public class Class1
{
public House GetResultsByReflection(int HouseNumb,int pincode)
{
House house = new House ();
House.currentDay=DateTime.Now;
return house;
}
}
}
我必须在运行时动态调用此类,并且需要获取currentDay。
namespace callingproject
{
public string test()
{
int HouseNumb= 31231123;
int pincode= 124124124;
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"bin\ReflectionCALlingproject.dll");
Assembly assembly = Assembly.LoadFile(path);
Type type = assembly.GetType("ReflectionCALlingproject.Class1");
if (type != null)
{
MethodInfo methodInfo = type.GetMethod("GetResultsByReflection");
if (methodInfo != null)
{
ParameterInfo[] parameters = methodInfo.GetParameters();
object classInstance = Activator.CreateInstance(type, null);
object[] parametersArray = new object[] { HouseNumb, pincode}; //need to pass this values based on the parameterinfo.
result = methodInfo.Invoke(classInstance, parametersArray );
}
}
return result.ToString();
//result is House object how can i get the property from it.
}
}
我必须根据parameterinfo传递参数。
如果要更改调用方法参数,它应该可以正常工作。
如何根据parameterinfo传递值。
如何将结果转换为指定的house类?
在调用项目后将构建ReflectionCALlingproject.dll。 所以会出现构建错误。 所以我们必须使用反射并动态调用dll
答案 0 :(得分:1)
基于评论的更新
好的,根据您的评论解释为什么需要反思,听起来有一种更简单的方法。
基本上,方法GetResultsByReflection
位于WebProject1
的类中。现在,在FrameworkProject1
中,您想要调用该方法。这不起作用,因为您不能进行循环引用。这种情况经常发生,但它不是反射的一个好用例。相反,它是一种代码气味,表明你的项目组织得不好。
有两种可能的解决方案。
GetResultsByReflection
(及其包含类型,如果适用)移至FrameworkProject1
。由于您的Web项目必须已经引用了您的框架项目,因此这应该是一个简单的解决方案GetResultsByReflection
移至新项目(例如UtilityProject1
)。然后从UtilityProject
和FrameworkProject1
引用WebProject1
。原始答案
反思的挑战之一是你不能像你想要的那样充满活力。
我对这个前提感到有些困惑。听起来你确切知道dll的确切位置,方法名称是什么,合同是什么,需要什么参数,返回什么样的响应。鉴于所有这些事实,你为什么需要反思?如果你能真正描述你的根本问题,可能会有一个更简单的解决方案,它可以在编译时为你提供你想要的一切,而不会产生额外的风险和维护问题反思。
答案 1 :(得分:0)
好的,即使我认为你的问题仍然不明确,我也会有机会回答这个问题 - 这个答案可能无法帮助你,因为我认为你所拥有的是XY Problem。< / p>
现在我手动传递2个值而不考虑parameterinfo。
您已经知道如何使用ParameterInfo[]
获取GetParameters()
。您可以查询此对象以查找所需参数的数量和类型
如何将结果转换为指定的house类
这取决于,如果您事先知道您的方法将返回House
对象,您可以直接投射它。
House result = (House)methodInfo.Invoke(classInstance, parametersArray );
通常使用反射 - 插件架构。您首先要定义一个接口(比如IMyPlugin
),期望所有插件开发人员实现您的接口并使用反射实例化插件,但将其转换为IMyPluin
。
如果您事先不知道反映Invoke
电话的结果是什么,那么您对结果的了解就是object
。读取参数的唯一选择是继续使用反射。
object result = methodInfo.Invoke(classInstance, parametersArray );
PropertyInfo myProp = result.GetType().GetProperty("currentDay");
var currentDay = myProp.Invoke(result,null);
但是你处于一个持续不断的循环中,你无法在编译时知道currentDay
的结果,而不是你所知道的House
。
反思是最后的手段,具有特定的目的。如果这些概念让您如何使用它们,那么您几乎肯定会因为错误的原因而使用它们。