C# 动态返回模型的值

C# 动态返回模型的值,c#,.net,C#,.net,我有一个方法,它调用API并返回一个模型,如下所示: public class Book { string Name { get; set; } string Author { get; set; } string Genre { get; set; } } 这是一个示例函数 public static string GetValue(object reference) { Book book = new Book(); book.Name = "A";

我有一个方法,它调用API并返回一个模型,如下所示:

public class Book
{
   string Name { get; set; }
   string Author { get; set; }
   string Genre { get; set; }
}
这是一个示例函数

public static string GetValue(object reference)
{
    Book book = new Book();
    book.Name = "A";
    book.Author = "B";
    book.Genre = "C";

    return ?? // I have no idea
}
如果我调用GetValueName,那么该方法应该返回book.Name值。如果调用GetValueGene,则该方法应返回book.Genre


我怎么做

我认为可以用函数的方式来实现,方法是将MemberExpression对象传递到方法中,就像LINQ那样。因此,您可以将此方法设置为泛型,例如,将其键入Book,然后将表达式作为第二个参数传入以选择属性值

然后可以使用GetValuemyBook、book=>book.Name之类的方法。不幸的是,我现在不能给你看,但是如果没有其他的想法,我会在今天晚上当我的电脑准备好的时候回来找你

book.GetType().GetProperty(reference).GetValue(book, null);
确保引用是一个带有属性名称的字符串,例如:name、Genre


虽然这似乎是一个奇怪的用例,但您通常希望返回图书,然后直接访问图书上的属性。如果您现在多次需要一个属性,那么每次尝试使用此方法访问一个属性时,您的方法都会调用API

因此,直接方法可能是这样的:

   public static R GetValue<R>(Func<Book, R> selector) {
        Book book = new Book();
        book.Name = "A";
        book.Author = "B";
        book.Genre = "C";

        return selector(book);
    }
var name = book.GetValue(b => b.Name);
然后,您可以将其概括为一种扩展方法,以便在将其作为输入提供时能够返回任何值:

public static R GetValue<T, R>(this T value, Func<T, R> selector) {
    return selector(value);
}
但是,您现在所处的位置是,这是一种更直接的方法:

var name = book.Name;

现在,我们回到了我最初的建议,只需从任何地方获取整本书,并直接访问其属性。

如果我正确理解了您的问题,您可以修改book类,如下所示:

public class Book
{
    private string _name;
    private string _author;
    private string _genre;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public string Author
    {
        get { return _author; }
        set { _author = value; }
    }

    public string Genre
    {
        get { return _genre; }
        set { _genre = value; }
    }

    public string GetValue( Criteria criteria)
    {
        switch (criteria)
        {
            case Criteria.Author:
                return _name;                    
            case Criteria.Genre:
                return _genre;                    
            case Criteria.Name:
                return _name;
            default:
                return string.Empty;
        }
    }
}

public enum Criteria
{
    Name,
    Author,
    Genre
}

这对我来说似乎很奇怪。为什么不返回模型本身并让调用方法选择它需要的属性呢?如果您有不同类型的属性,则必须返回object或dynamic—两者都有代价。您真正的问题是什么?你们想达到什么目的?只是为了还书。书的名字和书名。詹雷诺,也是作家。但是基于输入参数,它应该以字符串的形式返回值。是否尝试从另一种具有此功能的语言移植代码,而C则以不同的方式进行移植?
var name = book.Name;
public class Book
{
    private string _name;
    private string _author;
    private string _genre;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public string Author
    {
        get { return _author; }
        set { _author = value; }
    }

    public string Genre
    {
        get { return _genre; }
        set { _genre = value; }
    }

    public string GetValue( Criteria criteria)
    {
        switch (criteria)
        {
            case Criteria.Author:
                return _name;                    
            case Criteria.Genre:
                return _genre;                    
            case Criteria.Name:
                return _name;
            default:
                return string.Empty;
        }
    }
}

public enum Criteria
{
    Name,
    Author,
    Genre
}