簡體   English   中英

動態調用類方法

[英]Calling a class method dynamically

編輯:在現實生活中,我沒有Book Class。 這只是一個清楚的例子。 真正的問題確實需要反思才能解決。

假設我有一些課程:

書,蘋果,門。

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

和其他班級一樣。

我可以從字符串動態調用類方法嗎?

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

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

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

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

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

您可以使用反射來使用類似這樣的東西:

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

查找反射和MethodInfo。 我相信這將引導您走上所要尋找的道路。

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

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

從您的示例來看,您可以直接直接調用它:

string title = mybook.getTitle();

如果要點是您不知道並且不想關心要獲得的特定對象,則可以使用基類,也可以使用接口。

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

使您的類實現IProduct,並確保您的類將實現所需的屬性或函數,並且無論您使用的是“ Book”,“ Apple”還是“ Door”,它們都將是公共的”。

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

反射是可能的,但是在示例中,直接調用該方法會更簡單:

string title = myBook.getTitle();

您正在使用屬性值實例化新的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;
        }
    }

}

更好的是,如果這些方法對於您所有的類都是通用的,則創建一個接口並在您的類中繼承該接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM