我需要从引用的dll中将属性设置为客户端应用程序。
技术部分解释如下。
我有一个班级实例
public class test
{
public string Resultobj;
public string Result
{
get
{
return Resultobj;
}
set
{
Resultobj = value;
}
}
test obj = new test();
}
我将此作为参数发送给方法,该参数位于另一个程序集中。
callmethod(test obj );
所以在引用的程序集中我需要将值设置为实例,以便可以从应用程序访问它。 任何人都可以提供有关如何将属性设置为作为参数传递给方法的类实例的建议。
我在这里添加了我尝试但错误的内容。 : - (
public override void callmethod(ref object obj)
{
Type type = Type.GetType(obj);
PropertyInfo property = type.GetProperty("Result");
property.SetValue(type , "somevalue", null);
}
由于类名实例将在运行时传递,因此无法将类名称作为数据类型提供。 我在第
行收到错误 callmethod(test obj );
Argument '1': cannot convert from 'test ' to 'ref object'
答案 0 :(得分:4)
首先,您没有正确地将参数传递给callmethod
,因为它需要引用参数,您需要使用ref
关键字,例如
callmethod(ref (object)obj);
然后在callmethod
本身,将第一行更改为:
Type type = obj.GetType();
Type.GetType
需要string
表示类型,而不是实际的对象实例。最后,更新SetValue
调用以使用对象实例,而不是类型。
property.SetValue(obj, "somevalue");
答案 1 :(得分:0)
Type type = Type.GetType(obj);
PropertyInfo property = type.GetProperty("Result");
property.SetValue(type, "somevalue", null);
第一行错了。 Type.GetType(...)静态方法需要一个字符串,告诉它要加载哪个类型,而不是类型本身的实例。但是,由于你有一个实例,你可以调用obj.GetType()来完成你想要做的事情。
第三行也是错误的。 SetValue的第一个参数需要是您想要修改的实例,而不是类型。此外,您不需要第三个参数,因为SetValue的另一个重载只需要前两个参数。尝试将其更改为:
Type type = obj.GetType();
PropertyInfo property =type.GetProperty("Result");
property.SetValue(obj, "somevalue");
答案 2 :(得分:-1)
test obj = new test();
callmethod(ref obj);
我看到你已经将test obj = new test();
放在了课程定义中 - 为什么?
此外,在C#中,所有类名都应该使用CamelCase。我会重写类定义:
public class Test
{
public string Result { get; set; }
public Test(string result)
{
Result = result;
}
}
使用callmethod
(应该命名为CallMethod
,但我离题)的用法定义如下:
Test testInstance = new Test("Result string");
callmethod(ref testInstance);
callmethod
本身应该是这样的:
public override void CallMethod(ref object obj)
{
Type type = obj.GetType(obj);
PropertyInfo property = type.GetProperty("Result");
property.SetValue(obj, "somevalue");
}
和
CallMethod(ref testInstance);
希望这有帮助。