2017-03-09 29 views
-1

我有兩個班,狗和貓我能做的對象反射在C#

class Dog 
{ 
    public void speak() { 
     System.out.println("Woof!"); 
    } 
} 
class Cat 
{ 
    public void speak() { 
     System.out.print("Meow!"); 
    } 
} 

在我的主,我取的名字作爲字符串,無論是「貓」或「狗」。

public static void main(String [] args) 
{ 
    Scanner sc = new Scanner(System.in); 
    String name = sc.next(); 
    Class<?> cls = Class.forName(name); 
    Object object = cls.newInstance(); 
} 

我可以在C#中做這個嗎?

+5

是的,有這樣做的可能性,但你爲什麼不使用這個例子的繼承方法? – Thulur

+0

你可以試試這個http://stackoverflow.com/questions/6252510/get-object-by-reflection,但你必須添加另一個第三類。 – Shiglet

+2

你確定它是'C#'嗎? 'System.out.print()'看起來像'Java'? – Berkay

回答

2

逐行這將是:

public static void Main(string[] args) 
{ 
    string name = Console.ReadLine(); 

    // The second true will ignore case 
    var cls = Type.GetType("Animals." + name, true, true); 

    var @object = Activator.CreateInstance(cls); 
} 

與各種動物,如:

namespace Animals 
{ 
    public class Dog 
    { 
     public void speak() 
     { 
      Console.WriteLine("Woof!"); 
     } 
    } 

    public class Cat 
    { 
     public void speak() 
     { 
      Console.WriteLine("Meow!"); 
     } 
    } 
} 

我添加了一個命名空間,使其「更完整」的例子:在.NET你可以在任何命名空間以外使用你的代碼*,但是通常你會使用一個命名空間,我將它加入到從控制檯獲得的類的名字中("Animals." + name

請注意,這段代碼還是蠻有用的,因爲沒有一個基地interface/class,你不能輕易讓他們speak()(你可以去充分反映/動態,從這個點開始做,但它是「壞」)

與非線性動力糟糕的方式:

dynamic @object = Activator.CreateInstance(cls); 
@object.speak(); 

(注意:我不支持你在做什麼,這是不好的多種方式)

+0

謝謝@xanatos現在我解決了這個問題,它的工作 – tejas

+0

你好@xanatos你能告訴我如何在這種情況下傳遞參數? – tejas

+0

@tejas如果你遵循'動態'的方式,'@ object.speak(3)' – xanatos