[英]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敏锐地注意到的那样,您正在将Member
的Address
属性隐藏 。 由于您的通用方法被限制为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.