反思如何基于getparameters将值传递给参数并转换返回对象

时间:2016-08-31 13:01:29

标签: c# asp.net .net reflection

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

2 个答案:

答案 0 :(得分:1)

基于评论的更新

好的,根据您的评论解释为什么需要反思,听起来有一种更简单的方法。

基本上,方法GetResultsByReflection位于WebProject1的类中。现在,在FrameworkProject1中,您想要调用该方法。这不起作用,因为您不能进行循环引用。这种情况经常发生,但它不是反射的一个好用例。相反,它是一种代码气味,表明你的项目组织得不好。

有两种可能的解决方案。

  1. GetResultsByReflection(及其包含类型,如果适用)移至FrameworkProject1。由于您的Web项目必须已经引用了您的框架项目,因此这应该是一个简单的解决方案
  2. GetResultsByReflection移至新项目(例如UtilityProject1)。然后从UtilityProjectFrameworkProject1引用WebProject1
  3. 原始答案

    反思的挑战之一是你不能像你想要的那样充满活力。

    1. 如果您知道自己在寻找什么,可以使用parameters.Length查看,或者查看各个成员,看看它们是否是您期望的类型。但是,你不能让它充满活力,并且相信它会起作用。想象一下GetResultsByReflection方法已更新,因此它现在也需要一个String参数。您的呼叫代码无法知道要传递的内容。如果以破解方式更改基础方法的合同,则始终必须更新反射代码。
    2. 您是否100%保证该方法将返回House对象?如果是这样,你可以把它作为(House)结果投射。
    3. 我对这个前提感到有些困惑。听起来你确切知道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

反思是最后的手段,具有特定的目的。如果这些概念让您如何使用它们,那么您几乎肯定会因为错误的原因而使用它们。