繁体   English   中英

如何在DynamicProxy中为C#Auto-Property提供默认值?

[英]How do you give a C# Auto-Property a default value in DynamicProxy?

namespace ConsoleApplication15
{
  using System;
  using Castle.DynamicProxy;

  public class Test
  {
    private SubTestClass subTestClass;

    public string Status
    {
      get
      {
        return this.subTestClass.SubStatus;
      }

      set
      {
        this.subTestClass.SubStatus = value;
      }
    }

    public int Data { get; set; }
  }

  public class SubTestClass
  {
    public string SubStatus { get; set; }
  }

  public class Program
  {
    public static void Main(string[] args)
    {
      var proxyGenerator = new ProxyGenerator();
      var testObject = proxyGenerator.CreateClassProxy<Test>();
      if (testObject.Status != null)
      {
        Console.WriteLine("Working");
      }
    }
  }
}

我有以下代码,我想将Status默认值设置为Empty字符串。 当我运行以下代码时,Status字符串始终为Null并抛出一个null异常!!

testObject.Status这将返回一个空字符串而不会抛出异常。

要为自动实现的属性提供默认值,您必须在构造函数中执行以下操作:

[TestFixture]
public class UnitTest1
{
    [Test]
    public void TestMethod1()
    {
        var proxyGenerator = new ProxyGenerator();
        var testObject = proxyGenerator.CreateClassProxy<Test>();
        Console.WriteLine(
            testObject.Status != null 
            ? "Working" 
            : "no....");
    }
}

public class Test
{
    private SubTestClass subTestClass = new SubTestClass();

    public string Status
    {
        get
        {
            return this.subTestClass.SubStatus;
        }

        set
        {
            this.subTestClass.SubStatus = value;
        }
    }

    public int Data { get; set; }
}

public class SubTestClass
{
    public SubTestClass()
    {
        SubStatus = "";
    }
    public string SubStatus { get; set; }
}

我找到了IInterceptor问题的灵魂,我可以创建自定义结果。 感谢帮助!

namespace ConsoleApplication15
{
  using System;
  using Castle.DynamicProxy;

  public class Test
  {
    private SubTestClass subTestClass;

    public virtual string Status
    {
      get
      {
        return this.subTestClass.SubStatus;
      }

      set
      {
        this.subTestClass.SubStatus = value;
      }
    }

    public int Data { get; set; }
  }

  public class SubTestClass
  {
    public string SubStatus { get; set; }
  }

  public class Program
  {
    public static void Main(string[] args)
    {
      var proxyGenerator = new ProxyGenerator();

      var testObject = proxyGenerator.CreateClassProxy<Test>(new MyInter());


      if (testObject.Status != null)
      {
        Console.WriteLine("Working");
      }
    }

  }

  public class MyInter : IInterceptor
  {
    public void Intercept(IInvocation invocation)
    {
      if (invocation.Method.ReturnType == typeof(string))
      {
        invocation.ReturnValue = string.Empty;
      }
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM