如何在C#中将类实例作为参数传递给方法

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'

1
property.SetValue(obj, "somevalue"); ? - JleruOHeP
5
请澄清“它是错误的”。 - tnw
4
哪里出了问题?属性没有被设置吗?编译错误(我能看到代码中有一些问题,但假设它们只是拼写错误)?还是异常?你需要明确为什么它不能按照你期望的方式工作。 - James
错误1:最佳重载方法匹配“System.Type.GetType(string)”具有一些无效的参数。 错误2:参数'1':无法将'object'转换为'string'。 - Tom Cruise
我认为你工作太辛苦了。参数不需要是 ref,也不需要是 objectpublic void callmethod(test t) { t.Result = "somevalue"; } - Raymond Chen
3个回答

4

首先,你没有正确传递参数到callmethod方法。因为它需要一个引用参数,所以你需要使用ref关键字,例如:

callmethod(ref (object)obj);

然后在callmethod中,将第一行改为:

Type type = obj.GetType();

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

property.SetValue(obj, "somevalue");

我遇到了以下错误。错误1:'callmethod(ref object)'的最佳重载方法匹配有一些无效参数。错误2:参数'1':无法将'ref test'转换为'ref object'。 - Tom Cruise
听起来你正在将 Type 传递到 callmethod 而不是 实例。如果你按照我写的代码编写它,它应该可以工作(假设你在问题中的代码是正确的)。 - James
不,我传递的是实例而不是类型。我在问题中提供的正是我程序中所拥有的。当我将行“test obj = new test();”更改为“object obj = new test()”时,它可以正常工作。 - Tom Cruise
哦,抱歉,我的错误。我假设你在签名中有callmethod(ref Test obj)。如果你不需要访问与“Test”相关的任何内容,那么object obj = new test()就可以了,否则你可以在调用时进行转换(请参见答案更新)。 - James

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");

这也是一个问题,然而,原帖作者还没有遇到那个问题。问题出在第一行调用Type.GetType的地方,它需要一个类型的string表示,而原帖作者正在传递对象本身。 - James
@James,没错,我甚至没有注意到这一点(因为我只是粗略地浏览了一下,因为我已经注意到提供的代码无法编译...) - Chris

-1

嗯...这不是很简单吗:

test obj = new test();
callmethod(ref obj);

我看到你在类定义中放置了test obj = new test(); - 为什么?
此外,在C#中,所有的类名都应该使用驼峰命名法。我会这样重写类定义:
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);

希望这能有所帮助。

callmethod(obj)无法编译,需要作为引用传递,所以至少应该是callmethod(ref obj) - James
啊,是的,我忘记了方法签名。谢谢你指出来。 - Sameer Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接