2014-03-19 43 views
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字符串。 当我运行下面的代码时,状态字符串始终为Null,并抛出一个空异常!如何在DynamicProxy中给C#自动属性一个默认值?

testObject.Status这应该返回一个空字符串而不会引发异常。

回答

0

我发现了一个soultion与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; 
     } 
    } 
    } 
} 
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; } 
} 
+0

嗨@ Seany84谢谢你的提示,但问题在我真正的问题属性引用另一个类我会更新代码。在我提出这个问题之前,我已经想过你的灵魂了,但是这不会解决我的问题 –

+1

@BassamAlugili在你问的问题中,你问:“我想将状态默认值设置为空字符串”我已经测试了上面的代码版本),它符合你的问题,我相信。 – Seany84

+1

@ Seny84嘲笑空,而不是真正的空开始的问题SubTestClass为空我已更新代码,以清除它。 –