Есть ли способ создать реализацию свойств по умолчанию для интерфейсов C # - PullRequest
0 голосов
/ 30 июля 2010

Мне нравится техника создания методов расширения для интерфейсов для обеспечения функциональности по умолчанию.Одно из мест, где это очень удобно, - положить немного мяса на фиктивные классы для юнит-тестов.

Например,

public interface IEmployee
{
    IAddress Address { get; set; }

    IAddress GetAddress();
    void SetAddress(IAddress address);
}

public class Employee : IEmployee
{
    // Complex production stuff here (causes DB access)
}

public class TestEmployee : IEmployee
{
    // Simple unit testing stuff goes here (in memory only)
}

public static class EmployeeExtensions
{
    public static IAddress GetAddress(this IEmployee employee)
    {
        // Some sort of magic (maybe using IOC)
        // 'employee' can be either of type 'Employee' or of type 'TestEmployee'
    }

    public static void SetAddress(this IEmployee employee, IAddress address)
    {
        // Again with the magic
    }
}

Хорошо, может быть, не лучший пример, но вы поняли...

Ключ в том, что GetAddress и SetAddress могут вызываться как для Employee, так и для TestEmployee без поддержки кода ни одним из них.К сожалению, это больше похоже на Java, чем на C #.То, что я действительно хотел бы сделать для обоих, это работать напрямую со свойством Address и заставлять его выполнять ту же магию, что и методы.Чего я хочу избежать, так это писать код в конкретных классах (особенно в TestEmployee).

Есть ли способ предоставить реализации по умолчанию для свойства Address IEmployee?

Я знаю, что свойства C # на самом деле являются методами под капотом.В любом случае, как-нибудь обеспечить реализацию для них?

Может ли это быть сделано на другом языке .NET?

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

Существует множество способов сделать это, я полагаю.Как и предполагалось, вы можете просто создать иерархию, чтобы эти типы функций обрабатывались базовым классом.

Однако вас может заинтересовать решение для генерации кода, использующее Шаблоны T4 * 1004.* (от Microsoft).

0 голосов
/ 30 июля 2010

Как вы уже узнали, вы не можете добавлять свойства через методы расширения.Если это вопрос упрощения тестов, вы можете использовать фальшивый фреймворк, такой как Moq , чтобы избежать необходимости реализации этих свойств для каждого класса, который наследуется от интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...