[英]How to return a value of passed in property of generated object in c#
我有一个返回特定类型的函数。 例如 传真文件。 在该对象中,有几种不同的格式可供下载,例如:PDF,LargeJpg,SmallJpg等。
我可以这样称呼下载的pdf。
public FaxFile DownloadFaxPDFById(int faxId)
{
return DownloadFaxById(faxId).Pdf;
}
我想要做的是能够传递对象ex的属性。 LargeJpg格式下载。
须藤代码
public FaxFile DownloadFaxTypeById(int faxId, property)
{
return DownloadFaxById(faxId).property;
}
我该怎么做呢?
您可以使用反射。
var resultObj = DownloadFaxById(faxId);
var result = resultObj.GetType().GetProperty("<propertyName>").GetValue(resultObj);
请注意,您需要将结果强制转换为适当的对象
除了已经作为答案发布的方法之外,另一种方法是使用lambda表达式。 不确定下载对象的类型是什么,所以用您自己的类型替换DownloadedObjectType
。
public FaxFile DownloadFaxTypeById(int faxId, Expression<Func<DownloadedObjectType, FaxFile>> expression) {
if (!(expression.Body is MemberExpression)) {
throw new ArgumentException("Invalid expression");
}
return expression.Compile().Invoke(DownloadFaxById(faxId));
}
然后将其称为
DownloadFaxTypeById(faxId, obj => obj.Pdf)
但是看起来比简单地调用更丑陋
DownloadFaxTypeById(faxId).Pdf
除了可能为您提供对调用者可以检索哪些属性的控制,将它们限制为特定的返回类型,并且仅限制该类型实际可用的那些。 这样,对于部分可能的错误(例如,引用不存在的属性),您会得到编译时错误,而不是像使用反射时那样,会遇到所有运行时错误。
您首先不想这样做。 只需使用DownloadFaxById(faxId).Pdf/LargeJpg/...;
在调用位置,或者,如果您不想公开DownloadFaxById
返回的类,则可以使用子类或使用聚合,并在此新类中公开Pdf
, LargeJpg
,...。
您可能应该只对枚举支持的每种格式使用switch语句。 但是,如果您确实要使用反射,则可以如下所示:
void Main()
{
var foo = new Foo();
foo.GetType().GetProperty("MyProp").SetValue(foo, "Test");
var val = foo.GetType().GetProperty("MyProp").GetValue(foo);
Console.WriteLine(val);
}
public class Foo
{
public String MyProp { get; set; }
}
我建议为此创建一个enum
并将其传递给您的函数。
在您的功能内简单使用switch
。
这意味着要进行更多的编程,但是函数的用法要清晰得多。
这还有一个好处,就是您以后可以更改代码,而无需照顾功能的使用者就可以获取每种格式。
enum FaxFileType
{
PDF,
LargeJpg,
SmallJpg,
...
}
public FaxFile DownloadFaxById(int faxId, FaxFileType faxFileType)
{
switch (faxFileType)
{
case FaxFileType.PDF:
return DownloadFaxById(faxId).PDF;
case FaxFileType.LargeJpg:
return DownloadFaxById(faxId).LargeJpg;
case FaxFileType.SmallJpg:
return DownloadFaxById(faxId).SmallJpg;
...
default:
throw new NotSupportedException();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.