C# 是否可以创建类型的新实例而不进行反射?

C# 是否可以创建类型的新实例而不进行反射?,c#,asp.net,reflection,medium-trust,C#,Asp.net,Reflection,Medium Trust,我有一个函数,目前采用类型变量。这个函数将它粘贴在一个列表中,这样最终需要创建一个该类型的类 现在,我和你一起做 object o=MyType.GetConstructors()[0].Invoke(new object[0]); 这是相当骇客,也不会工作在中等信任由于反射(我想)。有没有更好的方法做到这一点而不反思 该类型以这种方式定义为函数的一部分。我需要“延迟”创建该类,因为如果不需要它,可能不会在应用程序中创建它。我用它作为例子,比如 AddToList(typeof(Whateve

我有一个函数,目前采用
类型
变量。这个函数将它粘贴在一个列表中,这样最终需要创建一个该类型的类

现在,我和你一起做

object o=MyType.GetConstructors()[0].Invoke(new object[0]);
这是相当骇客,也不会工作在中等信任由于反射(我想)。有没有更好的方法做到这一点而不反思

该类型以这种方式定义为函数的一部分。我需要“延迟”创建该类,因为如果不需要它,可能不会在应用程序中创建它。我用它作为例子,比如

AddToList(typeof(Whatever)); 
注意,我愿意接受关于更改函数调用的建议。我只需要懒洋洋地创建对象,并在列表中存储该类型(或者创建该类型的对象)

我考虑过lambdas,但我不确定他们会在这里工作

使用泛型:

public void Method<T>() where T : class, new()
{
  //code
  T t = new T();
}
就个人而言,我更喜欢第一种解决方案,因为它是强类型的。但是,您应该知道这两种方法都只允许无参数构造函数。如果需要传递参数,则需要反射树或表达式树。

使用泛型:

public void Method<T>() where T : class, new()
{
  //code
  T t = new T();
}

就个人而言,我更喜欢第一种解决方案,因为它是强类型的。但是,您应该知道这两种方法都只允许无参数构造函数。如果需要传递参数,则需要反射树或表达式树。

另一种解决方案是

请注意,创建实例时没有初始化任何字段/属性,即使您

class MyClass
{
   public int i = 99;
   public Object o = new object();
}

instance.i
将为0,
instance.o
将为空。很难提供纯无反射解决方案(因为您总是需要调用
o.GetType()
)。该解决方案本质上是序列化对象,然后将其反序列化为对象,因此不需要使用反射来调用其构造函数。但序列化/反序列化时仍存在反射。

另一种替代解决方案是

请注意,创建实例时没有初始化任何字段/属性,即使您

class MyClass
{
   public int i = 99;
   public Object o = new object();
}

instance.i
将为0,
instance.o
将为空。很难提供纯无反射解决方案(因为您总是需要调用
o.GetType()
)。该解决方案本质上是序列化对象,然后将其反序列化为对象,因此不需要使用反射来调用其构造函数。但是序列化/反序列化时仍然存在反射。

在对lambdas进行进一步研究之后,我发现它们将为我提供一个更优雅的解决方案,而且它不使用反射

所以我在列表定义中使用了

public delegate MyBaseType TypeCreator();

...
public TypeCreator Creator;
在我的函数调用中,一个简单而优雅的lambda:

AddToList(()=>{return new MyType();});

我认为这比我的反射方法更简洁,因为它允许将参数放入构造函数,还有一些其他原因超出了这个问题的范围。(它与我的项目配合得很好)

在对lambdas进行进一步研究之后,我发现它们将为我提供一个更加优雅的解决方案,而且它不使用反射

所以我在列表定义中使用了

public delegate MyBaseType TypeCreator();

...
public TypeCreator Creator;
在我的函数调用中,一个简单而优雅的lambda:

AddToList(()=>{return new MyType();});

我认为这比我的反射方法更简洁,因为它允许将参数放入构造函数,还有一些其他原因超出了这个问题的范围。(这与我的项目配合得很好)

“反射”基本上是指你正在尝试做的事情。。。你为什么要这么做?
类型从何而来?您是否正在创建对象工厂?如果是这样的话,你可能会对“反射”感兴趣,它的定义就是你要做的事情。。。你为什么要这么做?
类型从何而来?您是否正在创建对象工厂?如果是这样,您可能会对Activator实际上是反射感兴趣:Activator.CreateInstance()确实支持参数,它将它们作为对象[]啊,对了。我现在也读到了。但是,由于枚举类型对象总是可能的,表达式树应该可以工作(您需要使用一些反射来获取表达式的MemberInfos)。@Earlz even
new T()
是反射(对于类)。您确定吗?泛型是编译时特性(即编译时已知类型)。我不认为这是反射(即类型信息的运行时查找)。实际上Activator是反射:Activator.CreateInstance()支持参数,它将它们作为对象[]啊,对。我现在也读到了。但是,由于枚举类型对象总是可能的,表达式树应该可以工作(您需要使用一些反射来获取表达式的MemberInfos)。@Earlz even
new T()
是反射(对于类)。您确定吗?泛型是编译时特性(即编译时已知类型)。我不认为这是反射(即类型信息的运行时查找)。+1,但不是
FormatterServices。GetUninitializedObject(typeof(MyClass))
非常慢。+1,但不是
FormatterServices。GetUninitializedObject(typeof(MyClass))
非常慢。。