声明对象,初始化为不同的类型

本文关键字:类型 对象 初始化 声明 | 更新日期: 2023-09-27 18:04:11

是否有一种方法可以声明一个全局对象,然后根据用户输入将该对象初始化为特定类型?

如我所得到的:

  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的定义。还为

获得'no extension method'

对象本身做一些奇怪的事情,但简化了:

 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类,但是我找不到任何有用的东西。也许我看错方向了?

声明对象,初始化为不同的类型

可以使用interface

public interface MyInterface
{
    public string getObjectString{get;}
    public int32 getInt{get;}
}

然后使ClassAClassB像这样实现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;
     }

您还可以考虑继承。

您还可以返回一个对象检查并从返回方法中强制转换返回值

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;
}