0

假设我有这个通用方法:

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...
4

1 回答 1

0

类型推断要求推断所有泛型类型。如果您的方法采用类型参数,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);

尽管您想要这样做仍然没有多大意义。

于 2021-04-26T22:00:41.487 回答