Как использовать родинки для конструктора? - PullRequest
7 голосов
/ 16 мая 2011

У меня есть такой класс:

public class Product : IProduct
{
    static private string _defaultName = "default";
    private string _name;
    private float _price;
    /// Constructor
    public Product()
    {
        _price = 10.0F;
    }
    public void ModifyPrice(float modifier)
    {
        _price = _price * modifier;
    }  

Я хочу, чтобы ModifyPrice ничего не делал для определенного значения, но я также хочу вызвать конструктор, который устанавливает цену 10Я пробовал что-то вроде этого:

var fake = new SProduct() { CallBase = true };
var mole = new MProduct(fake)
    {
        ModifyPriceSingle = (actual) =>
        {
            if (actual != 20.0f)
            {
                MolesContext.ExecuteWithoutMoles(() => fake.ModifyPrice(actual));
            }
        }
    };
MProduct.Constructor = (@this) => (@this) = fake;

Но даже если fake хорошо инициализирован с хорошим конструктором, я не могу присвоить его @this.Я также пробую что-то вроде

MProduct.Constructor = (@this) => { var mole = new MProduct(@this)... };

Но на этот раз я не могу вызвать мой конструктор.Как я должен делать?

Ответы [ 2 ]

5 голосов
/ 07 июня 2011

Вам не нужно издеваться над конструктором, конструктор без параметров класса Product уже делает то, что вы хотите.

Добавить отладочную информацию к Product.

public class Product
{
    private float _price;
    public Product()
    {
        _price = 10.0F;
        Debug.WriteLine("Initializing price: {0}", _price);
    }
    public void ModifyPrice(float modifier)
    {
        _price = _price*modifier;
        Debug.WriteLine("New price: {0}", _price);
    }
}

Перемешивать только метод ModifyPrice.

[TestMethod]
[HostType("Moles")]
public void Test1()
{
    // Call a constructor that sets the price to 10.
    var fake = new SProduct { CallBase = true };
    var mole = new MProduct(fake)
    {
        ModifyPriceSingle = actual =>
        {
            if (actual != 20.0f)
            {
                MolesContext.ExecuteWithoutMoles(() => fake.ModifyPrice(actual));
            }
            else
            {
                Debug.WriteLine("Skipped setting price.");
            }
        }
    };
    fake.ModifyPrice(20f);
    fake.ModifyPrice(21f);
}

Посмотрите выходные данные отладки, чтобы подтвердить, что все работает как ожидалось:

    Initializing price: 10
    Skipped setting price.
    New price: 210

Кстати, здесь вам не нужно использовать заглушку,

var fake = new SProduct { CallBase = true };

будет достаточно создать экземпляр Product.

var fake = new Product();

Обновление: Насмешка одного метода может быть достигнута с помощью класса AllInstances, как этот

MProduct.Behavior = MoleBehaviors.Fallthrough;
MProduct.AllInstances.ModifyPriceSingle = (p, actual) =>
{
    if (actual != 20.0f)
    {
        MolesContext.ExecuteWithoutMoles(() => p.ModifyPrice(actual));
    }
    else
    {
        Debug.WriteLine("Skipped setting price.");
    }
};

// Call the constructor that sets the price to 10.
Product p1 = new Product();
// Skip setting the price.
p1.ModifyPrice(20f);
// Set the price.
p1.ModifyPrice(21f);
0 голосов
/ 04 августа 2011
MProduct.Behavior = MoleBehaviors.Fallthrough;
...