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