【发布时间】:2015-11-22 03:57:38
【问题描述】:
我创建了一个泛型方法,我想通过对该方法的引用传递一个对象来填充几个属性。它编译并运行没有问题,但没有填充对象。
我的通用方法
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”上时,该属性仍然是空的。
【问题讨论】:
-
"我想通过引用这个方法来传递一个对象来填充几个属性"你不需要
ref,除非它是struct -
你为什么要通过引用传递?您永远不会在方法中为
ob赋值。鉴于我们不知道数据是什么样子,我们无法说出为什么该方法的行为不像您预期的那样,但我认为您应该阅读pobox.com/~skeet/csharp/parameters.html -
如果你有
T: Address的约束,为什么还要有一个泛型方法?为什么不直接使用Address? -
@MattBurland:虽然它使用
ref,但它不适用于Merchant类型的变量。但是,是的,删除ref将允许它仅按值获取Address引用... -
为什么要在
Merchant类中重新定义Address中的属性?您的问题可能是由于隐藏了基类中的属性。Merchant继承Address而不是包含地址似乎很奇怪。
标签: c# object generics pass-by-reference ref