以下面的课程为例:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我想使用反射创建这种类型的实例:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)
通常这会起作用,但是由于SomeType没有定义无参数构造函数,调用Activator.CreateInstance将抛出类型异常,MissingMethodException并带有消息" 没有为此对象定义无参数构造函数. "是否还有另一种方法可以创建此类型的实例?将无参数构造函数添加到我的所有类中会有点麻烦.
我正在使用RedGate进行一些性能评估.我注意到动态创建一个实例Activator.CreateInstance(使用两个构造函数参数)需要花费相当多的时间...是否有更好的替代方法仍然使用反射方法(不是显式实例化)?
以下两种创建对象的方法有什么区别吗?
Student s1 = Activator.CreateInstance<Student>();
Student s1 = new Student();
Run Code Online (Sandbox Code Playgroud)
在.NET 4中创建在运行时确定的类型实例的最佳方法是什么?
我有一个实例方法,虽然作用于BaseClass对象可能会被其派生类的实例调用.我需要创建this与方法中相同类型的另一个实例.为每个派生类重载Method是不切实际的,因为它相当复杂,并且更有效地保持单个实现.
public class BaseClass
{
//constructors + properties + methods etc
public SomeMethod()
{
//some code
DerivedClass d = new DerivedClass(); //ideally determine the DerivedClass type at run-time
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些关于反射或使用动态关键字但我没有这些经验.
好的,所以我们都知道Reflecttion的性能要比"newing"类实例少得多,而且在很多情况下,根据应用程序的要求,这很好.
问题:我们如何使用后期绑定(反射)策略创建高性能.NET类.
我有一个现有的要求,即要求使用反射(CreateInstance)创建类实例,但性能至关重要.在我的情况下,我正在为我们的应用程序中的每个传入SMS消息创建实例.在生产过程中,每天可以轻松超过一百万.
我想听听并分享一些关于如何创建.NET类而不直接引用代码中的类的想法,例如使用Reflection.我还在想是否有办法以某种方式缓存一个可以改善"创建"时间的类Factory
我知道"default"关键字返回静态确定类型的默认值,如本问题中所示.
但是,给定一个类型的实例,是否有一种简单的方法来动态获取此类型的默认值?我发现谷歌搜索,而唯一的办法是这样:
static object DefaultValue(Type myType)
{
if (!myType.IsValueType)
return null;
else
return Activator.CreateInstance(myType);
}
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话我想避免使用Activator类.
我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。
这是映射器类:
// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
try
{
// initialize our returnable list
List<T> list = new List<T>();
// fire up the lamda mapping
var converter = new Converter<T>();
while (dr.Read())
{
// read in each row, and properly map it to our T object
var obj = converter.CreateItemFromRow(dr);
// add it to our list
list.Add(obj);
}
// reutrn it
return list;
} …Run Code Online (Sandbox Code Playgroud) c# reflection expression-trees dbdatareader linq-expressions
我有一个从隔离存储中提取对象的类.如果它找不到有问题的对象,则返回默认值(T),该值为null,因为它们是引用类型.如果返回的值为null,我会进行简单检查并在调用者中分配一个新实例,但我更愿意在存储逻辑中执行此操作.
所以我的问题是,有没有办法返回一个新的T,其中对象有一个默认的空白构造函数?
我正在寻找一种比Activator.CreateInstance从其类型实例化类更快的方法。
我现在正在这样做:Activator.CreateInstance(typeof(LoginView));但它非常慢:我在实例化不同视图时看到一些滞后。
给我一个建议?我现在在谷歌上搜索了几个小时,但我没有找到比这更快的方法来完成我想做的事情..:/
多谢 (:
c# ×8
reflection ×7
.net ×3
performance ×2
activator ×1
dbdatareader ×1
dynamic ×1
generics ×1
runtime ×1