C# 是否可以创建匿名通用对象?

C# 是否可以创建匿名通用对象?,c#,C#,假设您想要声明一个匿名类型的对象,但需要它是泛型的(我想不出实际的原因,这是理论上的)。您将如何创建这样一个对象 例如: var anonymousGeneric = new <T>{ }; // <- doesn't work var anonymousGeneric = Activator.CreateInstance((new { }).GetType()); // Not generic 结束编辑 但这两种方法都不管用。当然,这个想象中的问题的现实解决方案是定义一

假设您想要声明一个匿名类型的对象,但需要它是泛型的(我想不出实际的原因,这是理论上的)。您将如何创建这样一个对象

例如:

var anonymousGeneric = new <T>{ }; // <- doesn't work

var anonymousGeneric = Activator.CreateInstance((new { }).GetType()); // Not generic 
结束编辑

但这两种方法都不管用。当然,这个想象中的问题的现实解决方案是定义一个实际的类定义:

public GenericThing<T> { }
public genericing{}
但这并不像上面那样是匿名的

创建对象后,想象一下稍后将其与以下内容一起使用:

var anonymousGenericType = anonymousGeneric.GetType();

// These throw exception
// <>f__AnonymousType0#1 is not a GenericTypeDefinition. MakeGenericType may only be called on a type for which  Type.IsGenericTypeDefinition is true.
//   + System.RuntimeType.MakeGenericType(System.Type[])
var intThing = anonymousGenericType.MakeGenericType(typeof(int));
var stringThing = anonymousGenericType.MakeGenericType(typeof(string));  
var anonymousGenericType=anonymousGeneric.GetType();
//这些抛出异常
//f__AnonymousType0#1不是泛型类型定义。MakeGenericType只能在type.IsGenericTypeDefinition为true的类型上调用。
//+System.RuntimeType.MakeGenericType(System.Type[])
var intThing=anonymousGenericType.MakeGenericType(typeof(int));
var stringThing=anonymousGenericType.MakeGenericType(typeof(string));

总之,是否可以创建匿名泛型对象?

匿名泛型。GetType()
返回的泛型类型错误:1。如果要更改类型参数,则需要从中获取泛型类型定义

虽然我无法想象它对任何人都有什么好处,但以下方法确实有效:

现在我们有了一个类似于
anonymousGeneric
,但是它的类型参数是
int
,而不是
string
,并且它的
a
属性是9。但是它有什么好处呢?如何声明对它的引用?如果有时间,可以在XAML中绑定它的属性


1感谢艾米和塞维的参与,以澄清我对术语的困惑


请注意,天地间的事物比我的哲学所梦想的要多

anonymousGeneric.GetType()
返回了错误的泛型类型:1。如果要更改类型参数,则需要从中获取泛型类型定义

虽然我无法想象它对任何人都有什么好处,但以下方法确实有效:

现在我们有了一个类似于
anonymousGeneric
,但是它的类型参数是
int
,而不是
string
,并且它的
a
属性是9。但是它有什么好处呢?如何声明对它的引用?如果有时间,可以在XAML中绑定它的属性


1感谢艾米和塞维的参与,以澄清我对术语的困惑

请注意,天地间的事物比我的哲学所梦想的要多

(我想不出一个实际的原因,这是理论上的)

在这种情况下,让我们继续使用简单而明显的方法,因为更容易找到原因:只需从泛型方法创建一个常规匿名对象

public object Foo<T>(T t) { return new { t }; }
公共对象Foo(T){返回新的{T};}
在这里,
Foo(0)
Foo(“”
)必须返回不同的类型,但它们仍然共享一个类型定义

在泛型方法中,几乎所有匿名类型的使用都具有相同的意义

public object Foo<T>(T t) { return new { t }; }
(我想不出一个实际的原因,这是理论上的)

在这种情况下,让我们继续使用简单而明显的方法,因为更容易找到原因:只需从泛型方法创建一个常规匿名对象

public object Foo<T>(T t) { return new { t }; }
公共对象Foo(T){返回新的{T};}
在这里,
Foo(0)
Foo(“”
)必须返回不同的类型,但它们仍然共享一个类型定义


在泛型方法中,几乎所有匿名类型的使用都具有相同的意义。

匿名对象已经使用类似类型参数的行为创建:
new{Blargh=“foo”}
Blargh
是一个字符串。如果您创建了
新的{Blargh=9}
,那将是一个整数。将
粘贴在其上时会发生什么变化?请记住,匿名类型是作为泛型
元组的替代品添加的。您不认为根据定义,匿名已经是泛型了吗?如果它有静态定义或通过泛型定义的类型,那么它不是匿名的?@deezg一个匿名类型确实有一个类型(根据事实上的定义),它实际上是一个静态定义的类型,它只是一个没有名称的类型(或者至少没有可以使用的名称)。它是从房子里面传来的!!您是否尝试过
var anonymousGenericType=anonymousGeneric.GetType().GetGenericTypeDefinition()匿名类型已实现为泛型类型。您实际上想解决什么问题?匿名对象已经用类似类型参数的行为创建:
new{Blargh=“foo”}
Blargh
是一个字符串。如果您创建了
新的{Blargh=9}
,那将是一个整数。将
粘贴在其上时会发生什么变化?请记住,匿名类型是作为泛型
元组的替代品添加的。您不认为根据定义,匿名已经是泛型了吗?如果它有静态定义或通过泛型定义的类型,那么它不是匿名的?@deezg一个匿名类型确实有一个类型(根据事实上的定义),它实际上是一个静态定义的类型,它只是一个没有名称的类型(或者至少没有可以使用的名称)。它是从房子里面传来的!!您是否尝试过
var anonymousGenericType=anonymousGeneric.GetType().GetGenericTypeDefinition()匿名类型已实现为泛型类型。你到底想解决什么问题?
List
是一种封闭的泛型类型<代码>列表
是一种开放的泛型类型。它们都是泛型。[向艾米询问细节]我喜欢这些句子的并列:“向艾米询问细节。它确实有效,但我无法想象它对任何人都有什么好处。”为@RobertHarvey提供了所有细节
…尽管我无法想象
public object Foo<T>(T t) { return new { t }; }