Еще один вариант - использовать PIVOT
совместно с Row_Number()
. Пример
Select *
From (
Select A.ID
,A.[first_name]
,A.[last_name]
,Item = concat('Frosting ',Row_Number() over (Partition By B.ID Order by Line) )
,Value = frosting
From Customer A
Join Orders B on A.id=B.id
Where batter_code in (450,360)
) src
Pivot (max(Value) for Item in ([Frosting 1],[Frosting 2],[Frosting 3]) )pvt
. ID first_name last_name Frosting 1 Frosting 2 Frosting 3
101 Jane Smith Orange Cherry NULL
234 Jon Smith chocolate NULL NULL
Если Вы явно не вызовете конструктора в базовом классе, конструктора без параметров вызовут неявно. Нет никакого пути вокруг этого, Вы не можете инстанцировать класса без вызываемого конструктора.
Существует способ создать объект, не звоня никакой конструкторы экземпляра.
перед продолжением, быть очень уверенными, что Вы хотите сделать это этот путь. 99% времени это - неверное решение.
Это - то, как Вы делаете это:
FormatterServices.GetUninitializedObject(typeof(MyClass));
Вызов это вместо конструктора объекта. Это создаст и возвратит Вас экземпляр, не вызывая конструкторов или полевых инициализаторов.
при десериализации объекта в WCF это использует этот метод для создания объекта. Когда это происходит, конструкторы, и даже полевые инициализаторы не выполняются.
По крайней мере 1 ctor нужно назвать. Единственным путем вокруг этого, который я вижу, является включение. Имейте класс внутри или ссылку на другой класс.
Если то, что Вы хотите, к не вызов любой из двух конструкторов базового класса, это не может быть сделано.
конструкторы класса C# должны вызвать конструкторов базового класса. Если Вы не называете тот явно, , основа () подразумевается . В Вашем примере, если Вы не определяете, каким конструктором базового класса звонить, он совпадает с:
public BaseClassProxy : BaseClass
{
public BaseClassProxy() : base() { }
}
, Если Вы предпочитаете использовать другого конструктора базового класса, можно использовать:
public BaseClassProxy : BaseClass
{
public BaseClassProxy() : base(someIntValue) { }
}
Так или иначе, один из два будет быть названным, явно или неявно.
Я не полагаю, что можно обойти вызов конструктора. Но Вы могли сделать что-то вроде этого:
public class BaseClass : SomeOtherBase
{
public BaseClass() {}
protected virtual void Setup()
{
}
}
public BaseClassProxy : BaseClass
{
bool _fakeOut;
protected BaseClassProxy(bool fakeOut)
{
_fakeOut = fakeOut;
Setup();
}
public override void Setup()
{
if(_fakeOut)
{
base.Setup();
}
//Your other constructor code
}
}
При создании объекта BaseClassProxy, он ДОЛЖЕН создать экземпляр, он - базовый класс, таким образом, необходимо вызвать конструктора базового класса, чем Вы можете doo быть выбрать который звонить, как:
public BaseClassProxy (bool fakeOut) : base (10) {}
Для вызова второго конструктора вместо первого
Я боюсь, что не конструктор вызова основы не является опцией.
Я закончил тем, что делал что-то вроде этого:
public class BaseClassProxy : BaseClass
{
public BaseClass BaseClass { get; private set; }
public virtual int MethodINeedToOverride(){}
public virtual string PropertyINeedToOverride() { get; protected set; }
}
Это получило меня вокруг некоторых плохих методов базового класса.
Вот мое решение проблемы
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(new Child().Test);
}
public class Child : Parent {
public Child() : base(false) {
//No Parent Constructor called
}
}
public class Parent {
public int Test {get;set;}
public Parent()
{
Test = 5;
}
public Parent(bool NoBase){
//Don't do anything
}
}
}
А простое изящное решение. Можно изменить его согласно потребности.