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 и выдает нулевое исключение !!

testObject.Status возвращает пустую строку и не вызывает исключения.

3
Bassam Alugili 19 Мар 2014 в 13:42

2 ответа

Лучший ответ

Я нашел решение проблемы с 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;
      }
    }
  }
}
0
Bassam Alugili 19 Мар 2014 в 20:27

Чтобы присвоить автоматически реализованным свойствам значение по умолчанию, вам нужно будет сделать это в конструкторе или что-то вроде этого:

[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; }
}
2
Seany84 19 Мар 2014 в 14:23
Привет @ Seany84, спасибо за совет, но проблема в моей реальной проблеме: свойство ссылается на другой класс, я обновлю код. Я думал о вашей душе, прежде чем задать этот вопрос, но это не решит мою проблему.
 – 
Bassam Alugili
19 Мар 2014 в 13:53
1
В своем вопросе вы задали: «Я хочу установить значение по умолчанию для статуса на пустую строку». Я протестировал приведенный выше код (см. Отредактированную версию), и я считаю, что он соответствует вашему вопросу.
 – 
Seany84
19 Мар 2014 в 14:02
1
Издевался над пустым, а не на самом деле пустым, проблема в начале SubTestClass равна нулю. Я обновил код, чтобы прояснить его.
 – 
Bassam Alugili
19 Мар 2014 в 14:04
Я еще раз отредактировал свой ответ. Пожалуйста, дайте мне знать, если чего-то не хватает.
 – 
Seany84
19 Мар 2014 в 14:25
2
Помимо использования конструктора, как ответил Seany84, я не могу найти способ инициализировать свойства прокси-объекта в Castle.DynamicProxy. Ответ Seany84 - хорошая идея; настройте свой конструктор для инициализации ваших полей
 – 
samy
19 Мар 2014 в 14:28