[英]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.