2014-03-19 45 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爲空我已更新代碼,以清除它。 –