泛型:使用泛型方法上的约束'where T:class'访问对象属性

时间:2018-08-26 11:14:48

标签: c# generics constraints

很抱歉,这个问题是否在其他地方讨论过,但是我还没有找到答案。

我目前正在使用C#学习泛型,并且不喜欢将泛型对象引用传递给以下对类型实参有约束的方法

public static T GetProperty<T>(T obj) where T : class

在这种方法中,我希望访问Isbn类的Book属性(我将在下面进一步概述),但看不到如何实现。例如。在方法GetProperty<T>(T obj)的主体中,我希望按照以下方式进行操作:

public static T GetProperty<T>(T obj) where T : class
{
    // How to access the passed in generic object's properties?
    // E.g. passing in an object of type Book, which has a property 'Isbn',
    // how do I return obj.Isbn?
}

目前,GetProperty<T>(T obj)方法位于名为Utilities的类中。

我已经创建了一个用于测试的简单类:

public class Book
{
    public int Isbn { get; set; }
}

我创建Book的新实例并设置Isbn属性:

Book book = new Book() { Isnb = 1234 };

然后我像这样调用GetProperty()方法:

Utilities.GetProperty(book);

感谢您的帮助或对我可以解决此问题的任何参考。

3 个答案:

答案 0 :(得分:0)

好吧,除非您将obj强制转换为Book之类的东西

(obj as Book)?.Isbn

是的,可以使用反射,但是如上所述,不确定在这种情况下为什么需要通用方法。

var property = typeof(T).GetProperties().Where(p => p.Name = "Isbn").Select(p => p).
return obj.GetType().GetProperty(property.Name).GetValue(obj, null); 

答案 1 :(得分:0)

您将不得不在此处使用反射, 我将T作为属性类型(结果)并添加参数propName

 public static T GetProperty<T>(Object obj,string propName) where T : class
    {
        return (T)src.GetType().GetProperty(propName).GetValue(obj, null);
    }

答案 2 :(得分:0)

返回类型应与您期望的相同

public static int? GetProperty<T>(T obj) where T : class
{
    bool isBook = (obj is Book);
    if(isBook)
    {
        var bookObj = (obj as Book);
        return ((bookObj != null) ? bookObj.Isbn : null);
    }
    return null;
}