Я использую следующий метод, который работает каждый раз:
Перекомпилировали.
К сожалению, в настоящее время это сложно. В C # 4 динамический тип может немного помочь в этом. COM-взаимодействие - одно из тех мест, которые действительно выделяют динамику.
Однако пока что единственный вариант, который позволяет вам иметь любой тип объекта без ограничений на интерфейсы, - это возврат к использованию отражения.
] Вы можете использовать отражение, чтобы найти свойство "attribute" и установить его значение во время выполнения.
К сожалению, единственный способ сделать это - ограничить параметр типа интерфейсом, который определяет это свойство и реализован для всех типов.
Поскольку у вас нет исходного кода, это будет невозможно реализовать, и вам придется использовать какой-то обходной путь. C # имеет статическую типизацию и поэтому не поддерживает тот тип утиной печати, который вы хотите здесь использовать. Лучшее, что появится в ближайшее время (в C # 4), - это ввести объект как dynamic
и разрешить вызовы свойств во время выполнения (обратите внимание, что этот подход также не будет универсальным, поскольку вы не можете ограничить параметр универсального типа как динамический
).
Что ж, в зависимости от того, насколько громоздок ваш код обработки исключений (и, если я не ошибаюсь, может быть именно так), вам может помочь следующий трюк:
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...
}
}