Дженерики C#: я могу ограничить к ряду классов, которые не реализуют интерфейс?

Вам просто нужно вызвать функцию один раз в скрипте. Смотри код ниже, я позвонил showHide('show', 'hideUI'); сразу после объявления функции.

function showHide(thingToHide, thingToShow) {
  document.getElementById("status").innerHTML = "Shown";
  if (thingToHide == "showUI") {
    document.getElementById("status").innerHTML = "Hidden";
  }
  document.getElementById(thingToHide).style.visibility = "hidden";
  document.getElementById(thingToShow).style.visibility = "visible";
}
showHide('showUI', 'hideUI');
<div id="hideUI">
  <input id="showButton" type="button" onclick="showHide('hideUI', 'showUI');" value="Show UI" />
</div>

<div id="showUI">
  <input id="hideButton" type="button" onclick="showHide('showUI', 'hideUI');" value="Hide UI" />
  <p> Various UI goes here</p>
</div>
<p id="status">Start</p>

5
задан Rob Stevenson-Leggett 20 October 2008 в 16:03
поделиться

4 ответа

Принятие сгенерированных классов неравнодушно, можно создать интерфейс и затем добавить другой частичный исходный файл, чтобы заставить сгенерированные классы реализовать интерфейс. Затем можно ограничить интерфейсом как нормальный. Никакие изменения в фактическом сгенерированном коде не требуются :)

14
ответ дан 18 December 2019 в 14:53
поделиться

При получении по запросу этих объектов от веб-сервиса Вы, ulitmately действительно управляют используемыми определениями классов. Они только возникают из ничего (даже если у Вас действительно есть генератор кода или Visual Studio, создающая их первоначально). Существует все еще файл класса для каждого из них где-нибудь, которые должны быть скомпилированы с приложением, и необходимо смочь добавить единый интерфейс к тем определениям классов.

-2
ответ дан 18 December 2019 в 14:53
поделиться

Я записал бы класс преобразователя, который взял любой из Ваших трех объектов в новый объект, который поддерживает интерфейс, который Вы хотите. Кроме того, я использовал бы отражение, таким образом, Вы не должны вводить все присвоения вручную (если это не маленький объект и, как ожидают, не изменится слишком много).

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

0
ответ дан 18 December 2019 в 14:53
поделиться

Ограничение к списку классов в "ИЛИ" вид как Вы хочет сделать, не возможно в C#. (На самом деле я даже не уверен, что это законно непосредственно в IL также.)

Ваша единственная опция состоит в том, чтобы продолжать использовать функции стиля checktypes. При владении кодом для различных веб-сервисов можно также реализовать интерфейс "сигнальной метки" и использование что как ограничение. Я знаю, что интерфейсы сигнальной метки не являются методическими рекомендациями на Руководство по проектированию Платформы, но у них иногда есть свое использование (этот являющийся одним из них).

Как Jon указывает, Вы можете использовать prtial классы для реализации единого интерфейса. Если Ваш References.cs реализует класс:

namespace TestServices
{
   internal partial class Service1SoapClient : System.ServiceModel.ClientBase<T>, K
   {
   }
}

Вы затем создали бы другой частичный класс в том же пространстве имен (назовите это Ссылками. CommonInterface.cs), который может жить где угодно в Вашем проекте со следующим:

namespace TestServices
{
   internal interface ICommon
   {
   }

   internal partial class Service1SoapClient : ICommonInterface
   {
   }
}
1
ответ дан 18 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: