C# 在发送到基本构造函数之前修改参数值

C# 在发送到基本构造函数之前修改参数值,c#,inheritance,constructor,C#,Inheritance,Constructor,标题可能有点模棱两可,但我想不出更好的表达方式 我意识到我不能在调用基构造函数之前调用派生构造函数,但是我可以在将参数值传递给基构造函数之前以某种方式修改/创建参数值吗 比如说, public enum InputType { Number = 1, String = 2, Date = 3 } public class BaseClass { public BaseClass(InputType t) { // Logic }

标题可能有点模棱两可,但我想不出更好的表达方式

我意识到我不能在调用基构造函数之前调用派生构造函数,但是我可以在将参数值传递给基构造函数之前以某种方式修改/创建参数值吗

比如说,

public enum InputType
{
    Number = 1,
    String = 2,
    Date = 3
}

public class BaseClass
{
    public BaseClass(InputType t)
    {
        // Logic
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass(int i)
        : base(value)
    // Can I do something to infer what value should be here?
    {
        // Logic
    }
}

如果我有一个派生类可以推断基本构造函数所需的值(在本例中,
InputType.Number
int
有效),是否有方法在派生构造函数执行之前修改和/或创建传递给基构造函数的值?

是。可以使用不访问实例的普通表达式来操纵值。比如说

public DerivedClass(int i)
    : base((InputType)i)
{
}
没有

基本构造函数在DerivedClass构造函数中的任何逻辑之前运行,因此无法注入逻辑

但是,您可以运行基类构造函数,然后在dervied类的构造函数期间在基类中设置属性以更改值

我意识到我不能在调用基构造函数之前调用派生构造函数

但是你展示了这个代码

public DerivedClass(int i)
    : base(value)
{
    // Is it possible to set "value" here?
    // Logic
}

当输入该代码块时,基类构造函数已经运行。但是,您可以在将表达式中的值传递给基构造函数之前修改它(带有一些明显的约束)。但是,除非“value”是构造函数的输入,否则您将无法访问它。

我希望您可以在基类构造函数的参数列表中调用静态方法

public class DerivedClass : BaseClass
{
    public DerivedClass(int i)
        : base(ChooseInputType(i))
    {
    }

    private static InputType ChooseInputType(int i)
    {
        // Logic
        return InputType.Number;
    }
}
public class DerivedClass :
    BaseClass
{
    public
    DerivedClass(int i) :
        base(ComputedValue(i))
    {
    }

    public static InputType
    ComputedValue(int i)
    {
        return InputType.Number; // or any other computation you want here
    }
}

您可以在派生类上创建静态方法,并将逻辑放在其中:

public enum InputType {
    Number = 1,
    String = 2,
    Date = 3
}

public class BaseClass {
    public BaseClass(InputType t) {
        // Logic
    }
}

public class DerivedClass : BaseClass {
    public DerivedClass(int i)
        : base(GetInputType(i)) {
        // Is it possible to set "value" here?
        // Logic
    }

    private static InputType GetInputType(Int32 parameter) {
        // Do something with parameter
        // and return an InputType

        return (InputType)Enum.Parse(typeof(InputType), parameter);
    }
}

可以使用静态方法计算要传递给基构造函数的值

public class DerivedClass : BaseClass
{
    public DerivedClass(int i)
        : base(ChooseInputType(i))
    {
    }

    private static InputType ChooseInputType(int i)
    {
        // Logic
        return InputType.Number;
    }
}
public class DerivedClass :
    BaseClass
{
    public
    DerivedClass(int i) :
        base(ComputedValue(i))
    {
    }

    public static InputType
    ComputedValue(int i)
    {
        return InputType.Number; // or any other computation you want here
    }
}

base()
子句中放入任意逻辑而不引入单独的静态方法的一种方法是使用lambda或匿名委托。
base()
中的表达式在所有构造函数参数的范围内,因此您可以在lambda中自由使用它们。例如(假设这是C#2.0,因此没有LINQ为同一事物编写一行代码):

类基
{
公共基(int[]xs){}
}
派生类:基
{
公共派生(int-first,int-last)
:基本(
((Func)代表
{
List xs=新列表();
对于(int x=第一个;x<最后一个;++x)
{
xs.Add(x);
}
返回xs.ToArray();
})())
{
}
}

然而,我强烈建议不要在实践中使用它,因为从可读性的角度来看,这真的很可怕。使用静态方法时,您需要显式地将构造函数参数传递给它,但通常不会有超过3-4个参数。

但是,您不能通过DerivedClass构造函数中的逻辑创建“值”,因为base(…)是先运行的。@Reed,是的,这是一个输入错误。意思是放(输入类型)i。修正是的,你可以施展。“但他在寻求一种利用逻辑创造价值的方法,而这是你做不到的。”里德,我仍然不完全确定OP问题中的价值来自何方。但是可以创建可以传递给基类构造函数的新值(例如通过静态方法)。使用DerivedClass上的实例方法无法完成。请参见编辑,我在错误的行中键入了注释。。要在基构造函数调用下面键入。好的,我看到其他人向您建议,您可以在将值发送给基构造函数之前修改该值。Pavel,如果基类接受多个构造函数参数,有什么方法可以做到这一点吗?您可以为每个参数使用单独的lambda,但是您将无法在这些lambda之间共享变量(构造函数参数除外)。谢谢Pavel-这正是我试图解决的问题。。(在lambda之间共享变量)。基本上,我想封装一些逻辑,这些逻辑执行一些计算并返回三个不同(但相关)的字段,每个字段将为基类的构造函数初始化一个不同的参数。最后,我回到了静态方法(如您所说的更具可读性),返回一个结构,并为每个参数调用一次静态方法,从而解决了这个问题。这很有技巧,但很有效,因为在我的场景中,调用静态方法之间没有任何副作用