很抱歉,这个问题是否在其他地方讨论过,但是我还没有找到答案。
我目前正在使用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);
感谢您的帮助或对我可以解决此问题的任何参考。
答案 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;
}