gpt4 book ai didi

c# - 以属性作为参数的通用函数

转载 作者:行者123 更新时间:2023-11-30 20:54:38 25 4
gpt4 key购买 nike

我想编写一个通用函数,它接受一个对象和该对象的一系列属性。在函数内部,我想选择一个新的匿名对象,它只是传入对象的那些属性。

我想做这样的事情:

public class SimpleClass
{
public DateTime ADate {get; set;}
public string StringHere {get; set;}
public int ANumber {get; set;}
}

var testObj = new SimpleClass();
// set values here on testObj properties
DoStuffHere(testObj, StringHere, ANumber);

我可以将属性作为字符串传入,然后使用反射从传入的对象中获取属性,但我想知道是否有某种方法可以传入属性本身,这样我就可以获得智能感知和编译时间检查以防止错误的属性名称。我希望我的 getNewClass 函数可以接受任何类型的对象,并且是通用的。

编辑:我不会返回新的匿名类型。我认为我的函数名称听起来是这样的。我将从内部从指定的 testObj 列表中选择一个新的匿名类型,并从这些属性生成 PDF。

最佳答案

定义匿名类型实际上非常复杂,尝试仅使用名称来完成它有点具有挑战性。基本上你想要的东西已经存在,但在常规 C# 中 - 所以对于单个对象:

var obj = new { testObj.StringHere, testObj.ANumber };

或者对于多个对象:

var projection = from obj in sequence
select new { obj.StringHere, obj.ANumber };

这已经是您所能得到的最简洁的了。您可以添加一个采用 Func<,> 的通用方法某种程度上,但它不会比上面的更干净。

没有什么用处:

var obj = SomeMagicMethod(obj, "StringHere", "ANumber");

因为SomeMagicMethod只能有用地返回 object - 我们的 obj变量在很大程度上将无法使用。


如果您不需要从方法中返回对象,那么您可以使用以下任一方法:

SomeMagicMethod<T>(T value) {
...
}
...
SomeMagicMethod(new {testObj.StringHere, testObj.ANumber });

或:

SomeMagicMethod<TFrom, TTo>(TFrom value, Func<TFrom, TTo> selector)
{
TTo actualVal = selector(value);
...
}
...
SomeMagicMethod(testObj, x => new {x.StringHere, x.ANumber });

就个人而言,我认为第一个更容易 - 第二个中的 func 太过分了。

你也可以只使用反射...

SomeMagicMethod(object obj, params string[] names)
{
foreach(var name in names) {
object val = obj.GetType().GetProperty(name).GetValue(obj);
// ...
}
}
//...
SomeMagicMethod(testObj, "StringHere", "ANumber");

关于c# - 以属性作为参数的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18983000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com