繁体   English   中英

将对象作为ref参数传递给泛型方法

[英]passing object as a ref parameter to generic method

我已经创建了一个通用方法,并且我想通过对该方法的引用来传递对象以填充少量属性。 它可以编译,并且可以正常运行,但是没有填充该对象。

我的通用方法

public static void SplitAddress<T>(ref T ob, string addressToSplit) where T : Address
    {
        //ptr : Postcode, Town, Region
        var ptr = addressToSplit.Split(new char[] { '-' }, 2, StringSplitOptions.RemoveEmptyEntries).ToList();
        var pt = ptr[0].Split(new char[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries).ToList();

        if (ptr.Count == 2)
        {
            ob.Region = ptr[1];
        }

        for (int x = 0; x < pt.Count; x++)
        {
            switch (x)
            {
                case 0:
                    {
                        ob.PostCode = pt[x];
                        break;
                    }
                case 1:
                    {
                        ob.Town = pt[x];
                        break;
                    }
            }
        }
    }

我要通过的对象

class Merchant : Address
{
    public int MeId { get; set; }
    public int HoId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Address { get; set; }
    public string PostCode { get; set; }
    public string Town { get; set; }
    public string Region { get; set; }
    public string VatNr { get; set; }
    public string TRSshopId { get; set; }

}

地址类别

abstract class Address
{
    public string PostCode;
    public string Town { get; set; }
    public string Region { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Adrress { get; set; }
}

方法调用

Methods.SplitAddress<Merchant>(ref me, row.Cells[i].Text);

我可以为两种不同的对象类型创建两个重载方法,但是它们将重复相同的代码,这是我想避免的。 它看起来很奇怪,但是例如正在填充“邮政编码”,但是当我将鼠标悬停在“ ob”上时,该属性仍然为空。

编辑

正如@Lee敏锐地注意到的那样,您正在将MemberAddress属性隐藏 由于您的通用方法被限制为Address类型的成员,因此您的代码实际上是在更改隐藏的Address类的属性,而不是Merchant类的属性,因此,如果您拥有Merchant类型的变量,则看不到这些更改。 。 如果将Member转换为Address则会看到这些值。 只需从Merchant删除这些属性,就可以了。

ps Member 继承表格Address似乎是错误的-成员有一个地址,但不是地址。 更好的设计是:

class Merchant
{
    public int MeId { get; set; }
    public int HoId { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public string VatNr { get; set; }
    public string TRSshopId { get; set; }

}

原始答案

我想通过引用此方法来传递对象以填充一些属性

由于Address是一类,因此您无需使用ref 引用类型的参数将包含对与传入变量相同对象的引用 ,因此您可以更改该对象的属性值,并且调用方法将看到这些更改。 最主要的ref可以让你做的是改变引用不同的对象,你不这样做,所以使用ref不会改变你正在尝试做的。

我建议你运行它在调试,以确保您if块得到执行的方式,你希望他们。 (例如ptr.Count == 2 true吗?它可以大于2吗?)

同样,您的整个for块可以减少为:

if(pt.Count > 0)  ob.PostCode = pt[0];
if(pt.Count > 1)  ob.Town = pt[1];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM