C# 动态调用类方法
编辑:在现实生活中,我没有读书课。这只是一个明确的例子。真正的问题确实需要反思才能解决。 假设我有一些类: 书、苹果、门C# 动态调用类方法,c#,C#,编辑:在现实生活中,我没有读书课。这只是一个明确的例子。真正的问题确实需要反思才能解决。 假设我有一些类: 书、苹果、门 class Book { ... public decimal getPrice() {...} public string getTitle() {...} public decimal getAuthor() {...} } 其他课程也一样 我可以从字符串动态调用类方法吗: Book myBook = new Book("Tit
class Book
{
...
public decimal getPrice()
{...}
public string getTitle()
{...}
public decimal getAuthor()
{...}
}
其他课程也一样
我可以从字符串动态调用类方法吗:
Book myBook = new Book("Title", "Author", 44);
string title = runMethod(myBook, "getTitle");
查找反射和MethodInfo。我相信这将引导您走上您正在寻找的道路。查找反射和MethodInfo。我相信这会引导你走上你正在寻找的道路。你可以通过 您可以通过以下方式完成此操作
反射是可能的,但在本例中,直接调用该方法会更简单:
string title = myBook.getTitle();
string title = mybook.getTitle();
反射是可能的,但在本例中,直接调用该方法会更简单:
string title = myBook.getTitle();
string title = mybook.getTitle();
您可以使用这样的方法,使用反射:
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;
}
}
类程序
{
静态void Main(字符串[]参数)
{
var b=新书(“书名”,2342);
WriteLine(CallMethod(b,“GetTitle”,“未找到”);
}
公共静态K调用方法(TA、字符串方法、K defaultOjb)
{
var t=a.GetType();
var mi=t.GetMethod(方法);
如果(mi==null)返回defaultOjb;
var ret=mi.Invoke(一个新对象[]{});
返回(K)ret;
}
}
公共课堂用书
{
私有只读字符串_title;
私有只读十进制价格;
公共价格()
{
退货价格;
}
公共字符串GetTitle()
{
返回标题;
}
公共图书(字符串标题,十进制价格)
{
_头衔=头衔;
_价格=价格;
}
}
您可以使用类似的方法,使用反射:
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;
}
}
类程序
{
静态void Main(字符串[]参数)
{
var b=新书(“书名”,2342);
WriteLine(CallMethod(b,“GetTitle”,“未找到”);
}
公共静态K调用方法(TA、字符串方法、K defaultOjb)
{
var t=a.GetType();
var mi=t.GetMethod(方法);
如果(mi==null)返回defaultOjb;
var ret=mi.Invoke(一个新对象[]{});
返回(K)ret;
}
}
公共课堂用书
{
私有只读字符串_title;
私有只读十进制价格;
公共价格()
{
退货价格;
}
公共字符串GetTitle()
{
返回标题;
}
公共图书(字符串标题,十进制价格)
{
_头衔=头衔;
_价格=价格;
}
}
前面的答案提到反思是正确的
然而,除非你的真实问题与你的例子大不相同,否则这是没有必要的
从你的例子来看,你可以直接称之为:
string title = myBook.getTitle();
string title = mybook.getTitle();
如果问题是你不知道也不想关心你得到的是什么特定对象,你可以使用基类或者接口
public interface IProduct
{
string Name { get; }
string Type { get; }
float Price { get; }
}
让您的类实现IPProduct,您可以保证您的类将实现您所需的属性或函数,并且无论您处理的是“Book”、“Apple”还是“Door”,它们都是公共的
public void OutputProductsToConsole(列出产品)
{
对于(int i=0;i
前面的答案提到反思是正确的
然而,除非你的真实问题与你的例子大不相同,否则这是没有必要的
从你的例子来看,你可以直接称之为:
string title = myBook.getTitle();
string title = mybook.getTitle();
如果问题是你不知道也不想关心你得到的是什么特定对象,你可以使用基类或者接口
public interface IProduct
{
string Name { get; }
string Type { get; }
float Price { get; }
}
让您的类实现IPProduct,您可以保证您的类将实现您所需的属性或函数,并且无论您处理的是“Book”、“Apple”还是“Door”,它们都是公共的
public void OutputProductsToConsole(列出产品)
{
对于(int i=0;i
您正在用属性值实例化新书类。您是否没有分配这些值以便稍后可以将其取回
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;
}
}
}
更好的是,如果这些方法对所有类都是通用的,则创建一个接口并在类中继承该接口。您正在用属性值实例化新书类。您是否没有分配这些值以便稍后可以将其取回
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;
}
}
}
更好的是,如果这些方法在所有类中都是通用的,那么可以创建一个接口并在类中继承它。我可以问一下如何使用它吗?可以,请回答。我觉得在这个问题上我遗漏了一些东西。难道你不需要反思吗?我在Java中使用了它,很高兴C#也有它。在哪里使用它是一个很长的故事。但它确实是需要的。上面的例子只是一个解释我自己的例子。我当然不会那样使用它。我能问一下如何使用它吗?是的,请。我觉得在这个问题上我遗漏了一些东西。难道你不需要反思吗?我在Java中使用了它,很高兴C#也有它。在哪里使用它是一个很长的故事。但它确实是需要的。上面的例子只是一个解释我自己的例子。当然,我不会那样使用它。这是一种非常笨拙的取回东西的方式。在这种情况下,这完全是愚蠢的。不过,有时反射是非常有用的——这至少说明了所需的类型和方法。这是一种非常笨拙的方式来获取某些东西。在这种情况下,这完全是愚蠢的。不过,有时反射非常有用——这至少说明了所需的类型和方法。这是我的建议。这是我的建议。不,这与我的问题无关。对不起,我知道接口是什么。我真正需要的是从字符串调用方法。不,这与我的问题无关。对不起,我知道接口是什么。我真正需要的是从一个字符串调用一个方法。我接受它和你的所有ans