当前位置:编程学习 > C#/ASP.NET >>

c# 反射 能修改只读属性?


如图,我现在对这个属性想反射修改他(数据库链接写死了,郁闷)
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\bin\\db.dll");             
            Type t = assembly.GetType("db.Properties.Settings");
            object obj = Activator.CreateInstance(t);
            t.GetProperty("hyqssConnectionString").SetValue(obj, "Data Source=.\\MSSQL2005;Initial Catalog=xxx;User ID=test;Password=123456",null);


这样是实现貌似不行,提示“未找到属性设置方法”,还有其他办法修改不? C# 反射   反射 只读属性 --------------------编程问答-------------------- 属性编译后会生成get和set方法,如果是只读属性只生成get方法而不生成set方法,所以反射不能给只读属性赋值 --------------------编程问答-------------------- 难道没有其他办法了么? --------------------编程问答-------------------- 替换这个类所在的dll --------------------编程问答-------------------- 要能替换的,我还需要大费周章的反射么?
直接把链接写到配置文件不就得了。现在关键的问题是没办法替换。。。 --------------------编程问答-------------------- 都能反编译了,为什么不能替换,代码又没混淆,直接反编译整个项目 --------------------编程问答-------------------- 我没说应景反编译了,那个.net的反编译的工具导出的类库文件还是不是完全正确。编译通不过。 --------------------编程问答-------------------- 反射肯定达到LZ要求的,只是不是这么做的。
你应该先看看this[string index]这个索引器是干嘛的。 --------------------编程问答-------------------- this[string index]我估计那个是Reflector那个工具反编译有问题,导致显示成那样了。原本的写法应该
get{return;}就是最原始的get访问器 --------------------编程问答-------------------- 反射不能修改只读属性,要不这样能修改,那么属性的只能功能对微软来说是个鸡肋,安全性就不行了,如果那属性是你写的可以开放啊 --------------------编程问答-------------------- 只读的肯定不行。没有set怎么设置新值! --------------------编程问答-------------------- 属性本质上就是个方法,没有Set函数就自己根据Get函数模拟啊 --------------------编程问答--------------------
引用 11 楼 sbwwkmyd 的回复:
属性本质上就是个方法,没有Set函数就自己根据Get函数模拟啊

兄弟高见,如何实现?恕小弟孤陋寡闻。。。 --------------------编程问答--------------------
引用 12 楼 skyjoy2000 的回复:
兄弟高见,如何实现?恕小弟孤陋寡闻。。。

#7已经说了,先看看this[string index]这个索引器是如何实现的。
它从哪里取值,你就给哪里赋值,除非它返回的是字符串常量。 --------------------编程问答-------------------- 从Reflector看到的代码,还真是返回的一个常量 --------------------编程问答--------------------
引用 14 楼 skyjoy2000 的回复:
从Reflector看到的代码,还真是返回的一个常量

如果它返回的是常量,比如
public this[string index]
{
    get
    {
        if (index == "hyqssConnectionString") return "Data Source=.\\MSSQL2005;Initial Catalog=xxx;User ID=test;Password=123456";
        return null;
    }
}

如果所有使用这个常量的地方都要改成同一个值,而且修改以后的字符串长度小于等于这个常量长度,你可以使用unsafe+fixed的指针模式来修改它。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,