【发布时间】:2021-04-26 21:16:34
【问题描述】:
假设我有这个通用方法:
public T1 GenericTest<T1, T2>(T2 Obj, out T2 NewObj)
{
NewObj = Obj;
return default;
}
如何将匿名对象传递给它?
我用什么代替“???”在下面的例子中调用方法时:
var Anonymous = new { Prop1 = "foo", Prop2 = "bar" };
GenericTest<bool,???>(Anonymous, out var NewAnonymous);
NewAnonymous.Prop1 = "Hello";
NewAnonymous.Prop2 = "World";
//etc...
我的目标是在我调用该方法后让 Visual Studio 的 Intellisense 拾取“NewAnonymous”对象上的“Prop1”和“Prop2”。这需要推断匿名类型,但我不知道如何使用多个类型说明符。
注意:我希望能够访问从“out”参数返回的匿名对象的属性,所以键入“object”还不够好。如果我将“object”作为类型,我将无法从方法外部访问“NewAnonymous”对象的属性“Prop1”和“Prop2”。
注意 2:我不需要从方法中访问匿名对象的属性。
编辑:匿名对象确实可以传递给泛型方法。我只是不知道如何使用具有多个类型说明符的通用方法来做到这一点(这就是我提出这个问题的原因)。这是一个只有一个类型说明符的示例:
public void SingleGenericTypeTest<T>(T Obj, out T NewObj)
{
NewObj = Obj;
}
var Anonymous = new { Prop1 = "foo", Prop2 = "bar" };
SingleGenericTypeTest(Anonymous, out var NewAnonymous);
NewAnonymous.Prop1 = "Hello";
NewAnonymous.Prop2 = "World";
//etc...
【问题讨论】:
-
匿名类型有在编译时没有名字,所以你不能使用它们的“名字”作为通用参数。此外,您将无法调用
CreateInstance,因为匿名类型没有无参数构造函数。您需要准确解释为什么需要创建实例。或者解释一下您尝试做什么,我们可以提供实际解决方案。 -
@DStanley 我删除了 CreateInstance 调用,因为它与问题无关
-
这并不能解决您不能使用匿名类型作为泛型参数的问题。为什么需要访问属性?如果该方法是泛型的,您将不知道传入的是什么类型,因此您也不会知道它的属性。
-
@DStanley 您可以使用匿名类型作为通用参数。当只有一种类型参数而不是多个类型参数时,我知道该怎么做。我只是在问题中举了一个例子。
-
“我不需要从方法中访问对象的属性”——这只是您遇到问题的部分推断吗?
标签: c# types generic-method anonymous-objects