繁体   English   中英

如何在C#中返回已生成对象的通过属性的值

[英]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返回的类,则可以使用子类或使用聚合,并在此新类中公开PdfLargeJpg ,...。

您可能应该只对枚举支持的每种格式使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM