如何将匿名对象传递给具有多个泛型类型的泛型方法?[复制]

How to pass an anonymous object to a generic method with multiple generic types? [duplicate]

提问人:user3163495 提问时间:4/27/2021 最后编辑:user3163495 更新时间:4/27/2021 访问量:910

问:

假设我有这个通用方法:

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...
C# 类型 泛型方法 匿名对象

评论

0赞 D Stanley 4/27/2021
匿名类型在编译时没有名称,因此不能将其“名称”用作泛型参数。此外,由于匿名类型没有无参数构造函数,因此无法调用。您需要准确解释为什么需要创建实例。或者解释您做什么,我们可以帮助您提供实际的解决方案。CreateInstance
0赞 user3163495 4/27/2021
@DStanley 我删除了 CreateInstance 调用,因为它与问题无关
0赞 D Stanley 4/27/2021
这并不能解决你能解决的问题;t 使用匿名类型作为泛型参数。为什么需要访问这些属性?如果方法是泛型的,您将不知道传入的类型,因此您无论如何都不会知道它的属性。
0赞 user3163495 4/27/2021
@DStanley 可以使用匿名类型作为泛型参数。当只有一个类型参数时,我知道该怎么做,只是没有多个。我只是在问题中举了一个例子。
1赞 Peter Duniho 4/27/2021
“我不需要从方法中访问对象的属性”——所以这只是你遇到的部分推理吗?

答:

0赞 pinkfloydx33 4/27/2021 #1

类型推断要求推断所有泛型类型。如果你的方法采用了 type 的参数,则可以省略这些类型。不幸的是,您不能在这里这样做,因为不存在第一种类型的参数,并且无法指定不可描述的匿名类型。T1

您将得到的最好的是一个帮助程序方法,其中包含一个泛型参数,该参数传递到第二个泛型参数,指定两种类型:

public bool GenericHelper<T>(T Obj, out T NewObj)
{
    return GenericTest<bool, T>(Obj, out NewObj);
}

public T1 GenericTest<T1, T2>(T2 Obj, out T2 NewObj)
{
    NewObj = Obj;
    return default;
}

然后,您可以使用:

var Anonymous = new { Prop1 = "foo", Prop2 = "bar" };
bool res = GenericHelper(Anonymous, out var NewAnonymous);

虽然你想这样做仍然没有多大意义。