2009-12-31 154 views
1

編輯:在現實生活中,我沒有Book類。這只是一個清楚的例子。真正的問題真的需要反思來解決它。動態調用類方法

假設我有一些類:

書,蘋果,門。

class Book 
{ 
    ... 
    public decimal getPrice() 
    {...} 
    public string getTitle() 
    {...} 
    public decimal getAuthor() 
    {...} 
} 

和其他類相同。

可能我動態調用類方法從字符串:

Book myBook = new Book("Title", "Author", 44); 

string title = runMethod(myBook, "getTitle"); 
+1

我可以問一下這將如何使用? – Omar 2009-12-31 19:03:34

+0

是的,請。我覺得我缺少這個問題。 – jac 2009-12-31 20:05:34

+1

難道你不需要勃起?我在Java中使用它,並且很高興C#也擁有它。在哪裏使用它是一個漫長的故事。但它確實是需要的。上面的例子只是一個例子來解釋我自己。當然,我不會那樣使用它。 – JCasso 2010-01-01 07:10:33

回答

3

您可以使用這樣的事情,使用反射:

class Program 
{ 
static void Main(string[] args) 
{ 
    var b = new Book("Book Title", 2342); 

    Console.WriteLine(CallMethod(b, "GetTitle", "Not Found")); 
} 

public static K CallMethod<T,K>(T a, string method, K defaultOjb) 
{ 
    var t = a.GetType(); 

    var mi = t.GetMethod(method); 
    if (mi == null) return defaultOjb; 

    var ret=mi.Invoke(a, new object[] {}); 

    return (K) ret; 
} 
} 

public class Book 
{ 
private readonly string _title; 
private readonly decimal _price; 

public decimal GetPrice() 
{ 
    return _price; 
} 
public string GetTitle() 
{ 
    return _title; 
} 

public Book(string title, decimal price) 
{ 
    _title = title; 
    _price = price; 
} 
} 
+0

我2010年的第一個答案! – TheVillageIdiot 2009-12-31 19:18:28

+0

我接受它,你在2010年的所有答案將被接受:P(感謝它真的幫了很大忙) – JCasso 2010-01-01 07:18:13

1

查找反射和MethodInfo的。我相信這會引導你走向你所尋找的道路。

5

您可以通過Reflection來做到這一點。

Book myBook = new Book("Title", "Author", 44); 

string title = (string) myBook.GetType().GetMethod("getTitle").Invoke(myBook, null); 
+0

這是一種非常糟糕的方式來獲取回報。 – Chris 2009-12-31 19:12:29

+2

在這種情況下,這是完全愚蠢的。有時反射是非常有用的,但這至少可以證明所需的類型和方法。 – 2009-12-31 19:18:17

0

這是可能的反映,但在這個例子中,它會更簡單,只是直接調用方法:

string title = myBook.getTitle(); 
+0

非常真實,但我提供的例子只是爲了清楚。 – JCasso 2009-12-31 19:12:07

+0

這是我會建議的。 – Chris 2009-12-31 19:13:05

1

以前的答案在提及反思時是正確的。

但是,除非您的真實問題與您的示例有很大不同,否則不必要。

從你的例子來看,你可以簡單地直接調用它:

string title = mybook.getTitle(); 

如果一點是,你不知道,也不想理你被人給了你什麼樣的具體對象可以使用基類或接口。

public interface IProduct 
{ 
    string Name { get; } 
    string Type { get; } 
    float Price { get; } 
} 

讓你的類實現IProduct和你保證你的類將已經實現了你所需要的性能或功能,且他們將公衆無論你正在處理「書」, 「蘋果」或「門」。

public void OutputProductsToConsole(List<IProduct> products) 
    { 
     for (int i = 0; i < products.Count; i++) 
     { 
      Console.WriteLine(products[i].Name + ": " + products[i].Price); 
     } 
    } 
+0

不,這與我的問題無關。對不起,我知道接口是什麼。我真正需要的是從字符串調用方法。 – JCasso 2010-01-01 07:06:22

0

您正在使用屬性值實例化您的新Book類。你是不是分配這些值,以便以後可以讓他們回來?

public class Book 
{ 

    private string _title; 
    private decimal _price; 
    private string _author; 

    public Book(string title, decimal price, string author); 
    { 
     _title = title; 
     _price = price; 
     _author = author; 
    } 

    public string Title 
    { 
     get 
     { 
      return _title; 
     } 
    } 

    public decimal Price 
    { 
     get 
     { 
      return _price; 
     } 
    } 

    public string Author 
    { 
     get 
     { 
      return _author; 
     } 
    } 

} 

更重要的是,如果這些方法適用於所有的類創建一個接口和繼承,在你的類。