Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有人创建了一个开源动态.NET类,用于在另一个类上公开私有函数/属性?_.net_Reflection_Dynamicobject - Fatal编程技术网

是否有人创建了一个开源动态.NET类,用于在另一个类上公开私有函数/属性?

是否有人创建了一个开源动态.NET类,用于在另一个类上公开私有函数/属性?,.net,reflection,dynamicobject,.net,Reflection,Dynamicobject,如果是的话,我非常愿意使用它。有人有什么建议吗 我的目标是在我的测试解决方案中消除对_访问器项目的需求。我想,如果我创建了一个动态类,应该可以记录应用于它的函数,然后在另一个对象上使用反射重放这些函数。通过反射,我们可以称之为私有函数。(我想要C++的C#变体定义私有-公共。) 我想我自己也能做到这一点,但是为什么我可以重用一些代码。 如果你想用它来进行单元测试,就考虑改变你的单元测试方法。如果您深入到每个私有方法,那么您的测试与实际实现的耦合非常紧密 使用此方法的常见问题包括 非常脆弱且难以

如果是的话,我非常愿意使用它。有人有什么建议吗

我的目标是在我的测试解决方案中消除对_访问器项目的需求。我想,如果我创建了一个动态类,应该可以记录应用于它的函数,然后在另一个对象上使用反射重放这些函数。通过反射,我们可以称之为私有函数。(我想要C++的C#变体定义私有-公共。)


<>我想我自己也能做到这一点,但是为什么我可以重用一些代码。

如果你想用它来进行单元测试,就考虑改变你的单元测试方法。如果您深入到每个私有方法,那么您的测试与实际实现的耦合非常紧密

使用此方法的常见问题包括

  • 非常脆弱且难以维护的测试
  • 您的测试很可能会反映应用程序的行为和代码
  • 类的基本行为并不明显,因为有几十个测试描述了每个细节
每次你必须重构一些代码时,你也必须改变一系列测试。这将对重构造成巨大障碍,因为修复所有中断的测试需要时间和痛苦。您甚至有创建不希望的行为的风险,因为您必须更改太多的测试,从而更改原始行为

我建议编写测试类行为的测试。如果您改变了实现此行为的方式,您将根本不会破坏测试,并得到重构没有改变整体行为的确认


您的测试将更加清晰,并指定设计中真正重要的部分。这有助于重构,或者某些人(可能几个月后甚至是你)不得不再次进入代码。

您可以使用扩展动态访问每个私有函数

public static class ObjectEx
    {
        public static object CallPrivateFunc(this object obj,string funcName, params object[] args)
        {
            const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod;
            return obj.GetType().InvokeMember(funcName, bindingFlags, null, obj, args);
        }
    }
用法如下:

public class MyClass
    {
        private void  MyFunc(int a,string c)
        {
            Trace.WriteLine("MyFunc called a:" + a + " c:" + c);
        }
    }
...
myClass.CallPrivateFunc("MyFunc", 10, "c");
...

我尝试自己创建类,这段代码是否适用于方法调用:

public class UnPrivatify : DynamicObject
{
    private object _obj;

    public UnPrivatify(object obj)
    {
        _obj = obj;
    }

    public override bool TryInvokeMember(
        InvokeMemberBinder binder,
        Object[] args,
        out Object result)
    {
        Type t = _obj.GetType();

        result = t.InvokeMember(binder.Name,
            System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public,
            null,
            _obj,
            args);

        return true;
    }
}
apache许可使用的静态函数使用DLR通过binder.name调用方法或属性,以确定它是否私有。调用DynamicObject内部的对象应该很容易

编辑


在最新发布的4.0版本中,有一个抽象类,如果您创建一个没有任何更改的普通子类,它将向目标中的私有方法/属性转发动态调用。

我同意这些准则。但在我的具体案例中,我(我的公司)有使用_accessor特性的现有测试,我认为这可能会导致编译时崩溃(如果在同一解决方案中以不同方式引用同一项目)。我正在寻找一个简单的替代品,用于_访问器功能。回答得好。但这需要我更改每个调用,而不仅仅是对象创建。