2009-12-31 124 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; 
     } 
    } 

} 

更重要的是,如果这些方法适用于所有的类创建一个接口和继承,在你的类。