在DynamicProxy中如何给C#自动属性赋默认值?

3
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并抛出空异常!

testObject.Status 应返回一个空字符串,而不是抛出异常。

2个回答

2
为了给自动属性设置默认值,您需要在构造函数中或类似于以下方式进行设置:
[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; }
}

嗨@Seany84,感谢你的提示,但我的真正问题是属性引用了另一个类,我会更新代码。在提出这个问题之前,我已经考虑过你的解决方案,但这并不能解决我的问题。 - Bassam Alugili
1
@BassamAlugili 在你的问题中问道:我想将状态的默认值设置为空字符串。我已经测试了上述代码(请参见编辑后的版本),我认为它符合你的问题。 - Seany84
1
@Seny84嘲笑了空的和不真实的空的问题,开始时SubTestClass为null。我已经更新了代码以使其更清晰。 - Bassam Alugili
@BassamAlugili 我再次编辑了我的答案。请告诉我是否有遗漏的内容。 - Seany84
2
除了使用Seany84回答中提到的构造函数外,我找不到任何初始化Castle.DynamicProxy代理对象属性的方法。Seany84的答案是一个好方法:设置你的构造函数来初始化你的字段。 - samy

0
我找到了一个解决方案,用于解决与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;
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接