родовая функция с “имеет свойство X” ограничение?

Я использую следующий метод, который работает каждый раз:

  • Выбор весь из код впереди (разметка HTML и т.д.) в редакторе aspx/ascx файла.
  • Сокращение.
  • Сохраняют.
  • Вставка.
  • Сохраняют.

Перекомпилировали.

16
задан catfood 20 August 2009 в 17:23
поделиться

3 ответа

К сожалению, в настоящее время это сложно. В C # 4 динамический тип может немного помочь в этом. COM-взаимодействие - одно из тех мест, которые действительно выделяют динамику.

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

] Вы можете использовать отражение, чтобы найти свойство "attribute" и установить его значение во время выполнения.

4
ответ дан 30 November 2019 в 22:50
поделиться

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

Поскольку у вас нет исходного кода, это будет невозможно реализовать, и вам придется использовать какой-то обходной путь. C # имеет статическую типизацию и поэтому не поддерживает тот тип утиной печати, который вы хотите здесь использовать. Лучшее, что появится в ближайшее время (в C # 4), - это ввести объект как dynamic и разрешить вызовы свойств во время выполнения (обратите внимание, что этот подход также не будет универсальным, поскольку вы не можете ограничить параметр универсального типа как динамический ).

2
ответ дан 30 November 2019 в 22:50
поделиться

Что ж, в зависимости от того, насколько громоздок ваш код обработки исключений (и, если я не ошибаюсь, может быть именно так), вам может помочь следующий трюк:

class Chicken
{
    public string attribute { get; set; }
}

class Duck
{
    public string attribute { get; set; }
}

interface IHasAttribute
{
    string attribute { get; set; }
}

class ChickenWrapper : IHasAttribute
{
    private Chicken chick = null;
    public string attribute
    {
        get { return chick.attribute; }
        set { chick.attribute = value; }
    }
    public ChickenWrapper(object chick)
    {
        this.chick = chick as Chicken;
    }
}

class DuckWrapper : IHasAttribute
{
    private Duck duck = null;
    public string attribute
    {
        get { return duck.attribute; }
        set { duck.attribute = value; }
    }
    public DuckWrapper(object duck)
    {
        this.duck = duck as Duck;
    }
}

void SetAttribute<T>(T x, string value) where T : IHasAttribute
{
    try
    {
        x.attribute = value;
    }
    catch
    {
        // handle...
    }
}
6
ответ дан 30 November 2019 в 22:50
поделиться
Другие вопросы по тегам:

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