2015-05-19 2 views
1

У нас есть ряд классов, которые являются производными от общего класса:Кастинг Классы и Настройка Общие ценности

public class OurBaseClass 
{ 
    public string StatusMessage { get; set;} 
    [other properties] 
} 

public class ProcessClass : OurBaseClass 
{ 
    public string SomeProcessInformation { get; set;} 
    public string SomeMoreProcessInformation { get; set;} 
    [other properties] 
} 

Мы тогда пытались создать одну функцию, чтобы установить основные свойства SpecificProcessClass и тока есть (который не работает):

public object DefaultResponse(string messageText) 
{ 
    return new OurBaseClass 
    { 
     StatusMessage = messageText, 
     [other properties] = ... 
    } 
}; 

с целью, чтобы мы могли иметь

ProcessClass resp = (ProcessClass) DefaultResponse("Some Message"); 
resp.SomeProcessInformation = ""; 
resp.SomeMoreProcessInformation = ""; 
[other properties] = ... 
return resp; 

Обоснование состоит в том, чтобы минимизировать количество повторного кодирования и облегчить чтение функций (глазом); это вызывает ошибку для следующего.

System.InvalidCastException: Unable to cast object of type 'OurBaseClass' to type 'ProcessClass' 

Хотя не совсем удивлен результатом, как ProcessClass происходит от OurBaseClass, я предположил бы, что это можно сделать, просто не знаю, как ...

+0

Это не представляется возможным бросить экземпляр базового класса (менее конкретный класс) к экземпляру производного класса (более конкретный класс), потому что производный класс может/должен иметь больше функциональности, чем базовый класс. Другой способ работы отлично, вы можете привести экземпляр производного класса к экземпляру базового класса. –

ответ

5

Вы не можете отличить из менее производного типа в более производный тип, вам необходимо создать этот более производный тип в первую очередь.

Одно из решений, похожий на ваш текущий код, чтобы использовать дженерики:

public T DefaultResponse<T>(string messageText) 
    where T : OurBaseClass, new() 
{ 
    return new T 
    { 
     StatusMessage = messageText, 
    }; 
} 

В where ограничения ограничивают T для OurBaseClass или производный тип, а new() означает, что T должен иметь конструктор без параметров. Вы можете прочитать больше о них in the documentation

Он может быть использован как так:

ProcessClass resp = DefaultResponse<ProcessClass>("Some Message"); 
resp.SomeProcessInformation = ""; 
resp.SomeMoreProcessInformation = ""; 
0

Как насчет создания метода в базовом классе, чтобы установить общие свойства, а затем иметь виртуальный метод, который может быть переопределен в подклассах, каждый из которых вызывает базовый метод.

public class OurBaseClass 
{ 
    public string StatusMessage { get; set;} 
    // other properties 

    protected void BaseInit() 
    { 
     // Set common properties here... 
    } 

    public virtual void Init() 
    { 
     BaseInit(); 
    } 

} 

public class ProcessClass : OurBaseClass 
{ 
    public string SomeProcessInformation { get; set;} 
    public string SomeMoreProcessInformation { get; set;} 

    public override void Init() 
    { 
     BaseInit(); 

     // Set specific properties here... 
    } 
}