日期:2014-05-17  浏览次数:20788 次

能不能跨过构造函数创建对象
比如这样
class MyClass
{
public int Value{ get; set; }
public MyClass(int value)
{
this.Value = value;
throw new Exception();
}
}

void Main()
{
MyClass obj = new MyClass(1); // 会抛出错误。怎么样才能创建MyClass实例?
int value = obj.Value;
}

------解决方案--------------------
不能跨过构造方法创建实例,因为这是创建实例的前提。如果你不想执行这个构造方法,构造方法是可以重载的,你可以自己写一个构造方法去使用,那么就不会执行这个构造方法了。
------解决方案--------------------
对象创建不了通常不是内部单例实例化掉了,就是压根就不允许实例化,反正就是不想让外部实例化对象。这种情况下,外部就不用考虑实例化了,获取/设置属性是你唯一能做的了,除非该对象还有象Instance之类的内部实例公开出来了
------解决方案--------------------
反正在IL和CLR层次之上是办不到,包括反射/序列化/unsafe。除非你有能力hack CLR。
------解决方案--------------------
引用:
引用:"以MyClass为参数,但是这个对象创建不了(不要问为什么),而里面用到的只有Value属性,这个属性是公开可读写的。所以我想能不能只能创建这个对象,然后给Value赋值。"
前面说这个对象创建不了,后面又说能创建对象,自相矛盾。
如果说你想不在创建对象的时候就给对象的属性赋值,你就根本不需要写那个构造函数,使用默认的无参数构造……


你仿造的对象,又不是原来那个真正的对象,命名空间,包括类名都不一样,传进去会报参数不匹配的错误
------解决方案--------------------
完全不可能,例如把构造函数私有,那么这个类不可能创建一个对象.
------解决方案--------------------
你既然可以用用typeof(MyClass)了,就说明可以反编译它了,直接看看构造函数里面执行到哪里出的问题,然后想办法避免,如果要仿造那个类,不可能。
另外你确定那个是class而不是struct吗?struct是可以避开构造函数的。