Хорошо, так что в настоящее время я работаю с набором классов, которые я не могу контролировать в некоторых довольно общих функциях, использующих эти объекты. Вместо того чтобы писать буквально десятки функций, которые по сути делают одно и то же для каждого класса, я решил вместо этого использовать универсальную функцию.
Теперь классы, с которыми я имею дело, немного странны, так как производные классы имеют много одинаковых свойств, но базовый класс, из которого они получены, не имеет. Одним из таких примеров свойств является .Parent, который существует в огромном количестве производных классов, но не в базовом классе, и именно это свойство мне нужно использовать.
Для простоты понимания я создал небольшой пример:
class StandardBaseClass {} // These are simulating the SMO objects
class StandardDerivedClass : StandardBaseClass {
public object Parent { get; set; }
}
static class Extensions
{
public static object GetParent(this StandardDerivedClass sdc) {
return sdc.Parent;
}
public static object GetParent(this StandardBaseClass sbc)
{
throw new NotImplementedException("StandardBaseClass does not contain a property Parent");
}
// This is the Generic function I'm trying to write and need the Parent property.
public static void DoSomething<T>(T foo) where T : StandardBaseClass
{
object Parent = ((T)foo).GetParent();
}
}
В приведенном выше примере вызов DoSomething () вызовет исключение NotImplemented в реализации GetParent () базового класса, даже если я приведу приведение к T, который является StandardDerivedClass.
Это противоречит другому поведению приведения, когда понижающая версия заставит использовать реализацию базового класса.
Я вижу это поведение как ошибку. Кто-нибудь еще встречался с этим?