编辑:在现实生活中,我没有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");
答案 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;
}
}
}
更好的是,如果这些方法对于所有类都是通用的,那么创建一个接口并在类中继承它。