3

我需要从引用的 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'
4

3 回答 3

4

首先,您没有callmethod正确传递参数,因为它需要一个引用参数,您需要使用ref关键字,例如

callmethod(ref (object)obj);

然后就callmethod其本身而言,将第一行更改为:

Type type = obj.GetType();

Type.GetType需要string类型的表示,而不是实际的对象实例。最后,更新SetValue调用以使用对象实例,而不是类型,例如

property.SetValue(obj, "somevalue");
于 2013-07-24T13:52:26.343 回答
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");
于 2013-07-24T13:51:34.043 回答
-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);

希望这可以帮助。

于 2013-07-24T13:54:03.913 回答