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

时间:2014-05-19 21:56:20

标签: c#

有没有办法声明一个全局对象,然后根据用户输入初始化特定类型的对象?

比如我得到的东西:

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

2 个答案:

答案 0 :(得分:2)

您可以使用界面。

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

您也可以考虑继承。

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