2017-09-05 109 views
0

我有一堂课,我用正常的public Class1(int arg1, int arg2, int arg3) { ... } 进行初始化,这很简单。 但是我想实现的是参数需要改变。 例如,如果您将1传递给arg1,则第二个和第三个参数不会采用Int而是采用float。C#类初始化不同的参数?

是否可以在C#.NET Core中完成? 如果不是,那么C#中是否有可能? 又如何?

+3

这听起来像你问的是构造函数重载。你可以在你的对象上创建许多不同的构造函数。 – David

+1

这听起来像一个奇怪的事情 - 为什么你需要使类型依赖于第一个参数?为什么不创建不同的重载(并跳过第一个参数)? – UnholySheep

+2

不,这是不可能的。你可能想描述你想要达到的目标,我们可以帮助你选择其他方法。 –

回答

1

你为什么不只是创建两个不同的重载构造这样的:

public Class1(int arg1, int arg2, int arg3) { 
    if(arg1 == 1) { 
     throw new InvalidOperationException("Wrong constructor"); 
    } 
    ... 
} 

public Class1(int arg1, float arg2, float arg3) { 
    if(arg1 != 1) { 
     throw new InvalidOperationException("Wrong constructor"); 
    } 
    ... 
} 

或者,如果你喜欢它,没有例外容易一点(这将是我的首选方式):

public Class1(int arg1, float _arg2, float _arg3) { 
    if(arg1 != 1) { // Your int constructor, use arg2 and arg3 vars declared below 
     int arg2 = (int) _arg2; 
     int arg3 = (int) _arg3; 
     ... 
    } else { 
     // Your float constructor, use the _arg2 and _arg3 as your floats 
     ... 
    } 
} 

您想要的解决方案,以改变变量es在运行时是不可能的,但我认为我发布的最后一个代码非常接近。

+0

很好解释,谢谢!那样做了。但浮动物只是一个例子。我正在采取字符串或整数。但第一种选择正是我所期待的。 –

2

可以重载的构造函数

public Class1(int arg1, float arg3) 
+0

如果这样做了,那么消费者可以决定使用哪个超载,而不考虑arg1的值。 –

0

所以我找到了另一个答案。

您可以使用所有参数创建一个构造函数,然后允许它们为null,然后检查哪些元素为null,哪些是设置的。

可能不是做的最好的方式,但它的作品...不是要去使用它,但只要一想到它......