2014-01-22 3 views
1

В настоящее время я участвую в попытке создать метод, который будет принимать X число объектов, реализующих определенный интерфейс. Однако для удобства чтения я не хотел использовать новое ключевое слово для создания объекта.Создание объекта без использования нового или активированного или скомпилированного lambdas

Например, мой код будет выглядеть так:

var builder = new MyBuilder(); 
builder.Build(Value("Andre", "Like", "Test"), 
       Value("Bob", "and", "Andre")); 

То есть то, что я ищу. Я стараюсь, чтобы избежать необходимости делать:

var builder = new MyBuilder(); 
builder.Build(new Value("Andre", "Like", "Test"), 
       new Value("Bob", "and", "Andre")); 

или даже

var builder = new MyBuilder(); 
builder.Build(Value.Create("Andre", "Like", "Test"), 
       Value.Create("Bob", "and", "Andre")); 

Я понимаю, что в данном примере это не кажется какой-либо причине, чтобы сделать то, что я хочу, но, глядя мимо примера есть ли способ сделать то, что я хочу? Возможно, используя создание структуры и использование перегрузки оператора?

Значение в этом случае может быть классом или структурой, если они реализуют некоторый интерфейс, который принимает метод Build.

Если это слишком расплывчато, я могу попытаться дать лучшее описание.

+0

Возможно, сделать функцию Create членом класса, содержащего класс (или его базы)? – PMF

+0

@PMF Я надеюсь использовать MyBuilder во многих местах. Может ли это сделать еще один вариант? – dreza

+0

Первый пример выглядит как вызов метода. Так почему бы вам не послушать то, что написал PMF, и не создавать метод *, который затем может вызывать 'Builder', создавать' new' и т. Д. Перемещение повторяемого кода в частный метод класса очень полезно. – Sinatr

ответ

1

За то, что API вам нужно иметь Value метод, который возвращает new Value().

Если вы хотите использовать его в нескольких местах, может быть, вы можете изменить API быть:

var builder = new MyBuilder(); 
builder.Build().Value("Andre", "Like", "Test") 
       .Value("Bob", "and", "Andre"); 

Это не делает много смысла, как это, но вы можете иметь что-то вроде

var builder = new MyBuilder(); 
builder.BuildValue("Andre", "Like", "Test") 
     .Value("Bob", "and", "Andre"); 
0

Вы могли бы иметь статический метод, называемый Value, который делает новое для вас:

public static T Value<T>() where T : IInterface, new() 
{ 
    return new T(); 
} 

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

Метод может быть даже приложением get.

Edit: Для того, чтобы ответить на ваш комментарий ниже, я знаю, что ты не сказал, не Activator, но это все, что я могу думать:

public static class TypeExtensions 
{ 
    public static IInterface Value(this Type type) 
    { 
     return Activator.CreateInstance(type) as IInterface; 
    } 
} 

выше не имеет пространства имен, так что любой класс может использовать его. Пример ниже:

var test = typeof(Test).Value(); 
+0

Хорошо, но для этого потребуется, чтобы статический метод был либо в каждом классе, где я это делаю, либо я бы использовал статический метод, например MyClass.Value(). Могу ли я сделать это без необходимости иметь префикс класса? – dreza

+0

@dreza расширяет ли вам помощь? Я не слишком уверен, почему вы думаете, что писать новое ключевое слово - это такая проблема? – user1515024

+0

@dreza Вы можете взять первый метод ** T Value **, который я написал, и сделать его методом класса ** Builder **, после создания нового объекта внутри класса строителя вы добавите его в этот метод Build , – user1515024

Смежные вопросы