【问题标题】:How to pass an anonymous object to a generic method with multiple generic types? [duplicate]如何将匿名对象传递给具有多种泛型类型的泛型方法? [复制]
【发布时间】: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


【解决方案1】:

类型推断要求推断出所有个泛型类型。如果您的方法采用T1 类型的参数,则可以省略类型。不幸的是,您不能在此处执行此操作,因为不存在第一种类型的参数,并且无法指定 unspeakable 匿名类型。

你会得到的最好的方法是一个辅助方法,它有一个通用参数传递到第二个,同时指定两种类型:

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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多