有没有办法声明一个全局对象,然后根据用户输入初始化特定类型的对象?
比如我得到的东西:
class Program{
public myObject; // Trying to declare this globally
public static object myObject; //Also tried
public object myObject; //Also tried with no luck on any
static void getMode(string userInput){
switch(userInput){
case "a": myObject= new ClassA(); break;
case "b": myObject= new ClassB(); break;
default: myObject= new ClassC(); break;
}
Console.WriteLine(myObject.getObjectString);
}
static void getInt(){
Console.WriteLine(myObject.getInt.toString());
}
//More methods and stuff etc
}
每个A B和C类都有相同的方法。
但是,我得到的错误是'myObject'不包含getObjectString和getInt的定义。
也获得'无延伸方法'对象本身做了时髦的事情,但简化了:
public class ClassA{
public string getObjectString{
get{
string retVal = "Class A string";
return retVal;
}
}
public int32 getInt{
get{
int32 retVal = 42;
return retVal;
}
}
}
public class ClassB{
public string getObjectString{
get{
string retVal = "Class B string";
return retVal;
}
}
public int32 getInt{
get{
int32 retVal = 7;
return retVal;
}
}
}
我查看了Convert类,但我找不到任何有用的东西。 也许我看错了方向?
答案 0 :(得分:2)
您可以使用界面。
public interface MyInterface
{
public string getObjectString{get;}
public int32 getInt{get;}
}
然后让ClassA
和ClassB
实现MyInterface
,就像这样
public class ClassA : MyInterface{ ...
并以这种方式使用
public MyInterface myObject;
static void getMode(string userInput){
switch(userInput){
case "a": myObject= new ClassA(); break;
case "b": myObject= new ClassB(); break;
default: myObject= new ClassC(); break;
}
您也可以考虑继承。
答案 1 :(得分:0)
您还可以返回对象检查并从返回方法中转换返回的值
static object GetMode(string userinput) {
if (string.IsNullOrEmpty(userinput)) {
// use try catch in main method
throw new ArgumentException("Expected a value in the userinput");
// OR
return new ClassC();
}
userinput = userinput.toLower();
if (string.Equals("a")) {
return new ClassA();
} else if (string.Equals("b")) {
return new ClassB();
}
return new ClassC();
}
并在您的主要方法中
var obj = GetMode(userinput);
if (obj is ClassA) {
var classA = obj as ClassA;
// do something with classA
return;
}
if (obj is ClassB) {
var classB = obj as ClassB;
// do something with classB
return;
}
if (obj is ClassC) {
var classC = obj as ClassC;
// do something with classC
return;
}