C# 动态返回模型的值
我有一个方法,它调用API并返回一个模型,如下所示: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";
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
}