4

简单的例子,我有一个Cat带有Name属性的对象。

我有一个类的方法叫做PrintName<T>(T objectToPrint)

我不能这样做Console.WriteLine(objectToPrint.Name),因为它是 type T

那么我可以将参数作为获取名称的 linq 表达式传递吗?就像是;

Cat c = new Cat("Bernard the Cat");

PrintName(cat, parameter: c => c.Name);

然后 PrintName 就可以了

Console.WriteLine(cat.RunLinq(parameter));

4

3 回答 3

7

好吧,您可以使用接口,但如果属性可以更改,您可以这样做。

第一个解决方案:如果您需要属性的名称

PrintName<T>(T objectToPrint, Expression<Func<T, object>> property)

用法

PrintName(cat, c=> c.Name)

然后获取属性的“名称”,类似的东西。

var name = (property.Body as MemberExpression).Member.Name

第二种解决方案:如果您需要财产的价值

如果您想要属性的值,请使用Func<T, object> func参数

// object if you don't know the type of the property, 
// you can limit it to string if needed, of course
PrintName<T>(T objectToPrint, Func<T, object> func)

用法

PrintName(cat, c => c.Name)

然后

var value = func(cat)
于 2013-07-26T09:25:41.987 回答
3

通常这样做的方式是cat使用泛型传递类型:

void PrintName<T>(T cat, Func<T, string> parameter) {
 Console.WriteLine(parameter(cat));
}

委托可以使用确切的类型,T因此可以访问Name。LINQ 以这种方式工作很多(OrderBy,...)。如果我们用T这种object模式替换就行不通了,因为类型不会被传递。

于 2013-07-26T09:26:17.190 回答
0

您可以定义一个接口并在应该支持打印的每个对象上实现它

interface IPrintable
{
  string Name{get;}
}

class Cat : IPrintable
{
  string Name{get{retrun "Dog";}}
}

void PrintName(IPrintable objectToPrint)
{
  Console.WriteLine(objectToPrint.Name);
}

var cat = new Cat();
PrintName(cat);

你可以使用反射或动态来实现它而不需要接口实现

void PrintName<T>(T objectToPrint)
{
  dynamic o = (dynamic)objectToPrint;
  Console.Writeline(o.Name);
}
于 2013-07-26T09:29:17.800 回答