2013-03-06 3 views
0

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

В начале метода пришлось принимать только два параметра:

protected void LoadForm<T>(ToolStripButton formButton, string buttonText) where T : Base Form 

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

protected void LoadForm<T>() 
{ 
    LoadForm<T>(null, null); 
} 

Тогда мой колледж необходимо пройти еще один параметр: long? EntityId и снова не нарушать существующий код он изменил вышеуказанный метод:

protected void LoadForm<T>(long? loadEntityId = null) where T : BaseForm 
{ 
    LoadForm<T>(null, null, loadEntityId); 
} 

И фактический метод с бизнес-логикой стал:

protected void LoadForm<T>(ToolStripButton formButton, string buttonText, long? loadEntityId = null) where T : BaseForm 

Теперь мне нужно пройти четвертый параметр себя и снова вопрос с не нарушая предыдущий код актуален. Я думал, что я правильно понял логику, но, похоже, я этого не сделал. Мне нужно передать булево значение bool IsClosingForm поэтому я сделал метод witht он бизнес-логики, как это:

protected void LoadForm<T>(ToolStripButton formButton, string buttonText, long? loadEntityId = null, bool IsClosingForm= true) where T : BaseForm 

и добавить новый метод для обработки ситуаций, когда необходимо передать параметр BOOL:

protected void LoadForm<T>(bool IsClosingForm= true) where T : BaseForm 
{ 
    LoadForm<T>(null, null, null, IsClosingForm); 
} 

а также изменить мой метод колледжей для вызова метода четыре параметра:

protected void LoadForm<T>(long? EntityId = null) where T : BaseForm 
{ 
    LoadForm<T>(null, null, EntityId, true); 
} 

Но это не работает, как это и ошибка, я получаю:

Вызов неоднозначен между методом protected void LoadForm<T>(long? EntityId = null) и protected void LoadForm<T>(bool IsClosingForm= true)

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

+0

Можете ли вы опубликовать код, который вы используете, для вызова метода? Линия, которая генерирует эту ошибку? – goric

+0

У меня много ошибок, но все для неоднозначных вызовов, таких как 'LoadForm (false);' или 'LoadForm ();' Я думаю, что есть ошибка при попытке передать значение 'long? ', Но can not' find the actual пример прямо сейчас. – Leron

+5

Ты создаешь монстра. Не создавайте множество перегруженных методов - это ужасно для вызывающего. Вместо этого напишите методы с РАЗЛИЧНЫМИ НАЗВАНИЯМИ. И тогда вы можете сделать имена более описательными в отношении того, что они ожидают. –

ответ

2

Это неоднозначный вызов:

LoadForm<T>() 

Вызов может быть истолковано в качестве одного из следующих двух методов:

  • LoadForm<T>(long? EntityId = null)
  • или LoadForm<T>(bool IsClosingForm= true)

С вы указали значение по умолчанию для параметров, comp iler не может различать две перегрузки, когда аргумент не указан.

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

0

Возможно ли, что вы передаете в 0 или 1 в и его неоднозначное, чтобы он будучи bool или long? Возможно, приводите его к long в вызове метода для обеспечения регистрации в качестве long и не bool.