动态调用类方法

时间:2009-12-31 19:00:28

标签: c#

编辑:在现实生活中,我没有Book课程。这只是一个明确的例子。真正的问题确实需要反思来解决它。

假设我有一些课程:

书,Apple,Door。

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

和其他类相同。

我可以从字符串中动态调用类方法:

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

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

6 个答案:

答案 0 :(得分:5)

您可以通过Reflection完成此操作。

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

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

答案 1 :(得分: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;
}
}

答案 2 :(得分:1)

查找反射和MethodInfo。我相信这会引导你走上你正在寻找的道路。

答案 3 :(得分:1)

以前的答案在提及反思方面是正确的。

但是,除非你的真实问题与你的例子非常不同,否则这是不必要的。

从您的示例来看,您可以直接调用它:

string title = mybook.getTitle();

如果重点是你不知道并且不想关心你给出的具体对象,你可以使用基类或接口。

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

让您的课程实现IProduct,并保证您的课程将实现您所需的属性或功能,并且无论您是处理“Book”,“Apple”,它们都将公开。或“门”。

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

答案 4 :(得分:0)

可以使用反射,但在示例中,直接调用该方法会更简单:

string title = myBook.getTitle();

答案 5 :(得分: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;
        }
    }

}

更好的是,如果这些方法对于所有类都是通用的,那么创建一个接口并在类中继承它。