代码之家  ›  专栏  ›  技术社区  ›  Demodave

如何在c中返回生成对象的传入属性值#

c#
  •  1
  • Demodave  · 技术社区  · 6 年前

    我有一个返回特定类型的函数。传真文件。在该对象中有几种不同的格式可供下载,例如:PDF、LargeJpg、SmallJpg等。

    我可以这样称下载为pdf。

    public FaxFile DownloadFaxPDFById(int faxId)
    {
        return DownloadFaxById(faxId).Pdf;
    }
    

    Sudo代码

    public FaxFile DownloadFaxTypeById(int faxId, property)
    {
       return DownloadFaxById(faxId).property;
    }
    

    我该怎么做?

    5 回复  |  直到 6 年前
        1
  •  2
  •   Derviş Kayımbaşıoğlu    6 年前

    你可以使用反射。

    var resultObj = DownloadFaxById(faxId);
    var result = resultObj.GetType().GetProperty("<propertyName>").GetValue(resultObj);
    

    请注意,您需要将结果强制转换为适当的对象

        2
  •  1
  •   Yola    6 年前

    你一开始不想这么做。只用 DownloadFaxById(faxId).Pdf/LargeJpg/...; 在调用位置,或者,如果不想公开 DownloadFaxById 子类或使用聚合和公开 Pdf , LargeJpg , ... 在这个新班级里。

        3
  •  1
  •   Imantas    6 年前

    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
    

    除了可能为您提供对调用方可以检索哪些属性的一些控制之外,将它们限制为特定的返回类型,并且仅限于那些实际可用于该类型的属性。这样,对于可能的错误子集(如引用不存在的属性),您将得到编译时错误,而不是使用反射的情况下的所有运行时错误。

        4
  •  0
  •   Carlo Bos    6 年前

    对于枚举中支持的每种格式类型,您可能只需要使用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; }
    }
    
        5
  •  0
  •   nosale    6 年前

    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();
        }
    }