类不同,属性相同,如何实现代码复用?

zhlei616 2008-12-03 01:56:08
一堆不同的类,这些类的属性都相同,调用时需要给每个类的属性都赋值
产生大量重复代码,请问这些代码如何重用?
我试过泛型,一个泛型集合里的所有item必须是同一类型,无法实现上述功能
可能有人会问,既然这些类的属性都相同,干吗不写成一个类或者继承于一个父类?
实际情况是:我在Client端调用WebService,给每个WebService的SoapHeader初始化赋值时产生的这些重复代码
贴两个例子:

internal class SSystem : SalesTrack3.WS_SSystem.SSystem
{
public SSystem()
{
WS_SSystem.CSoapHeader sh = new SalesTrack3.WS_SSystem.CSoapHeader();
sh.ClientDomainName = Environment.UserDomainName;
sh.ClientUserName = Environment.UserName;
sh.Time = DateTime.Now;
sh.ClientPassword = CSystem.getPWD(sh.Time);
sh.id = CSystem.getSID();
CSoapHeaderValue = sh;
UseDefaultCredentials = true;
}
}
internal class SVisitRecord : SalesTrack3.WS_SVisitRecord.SVisitRecord
{
public SVisitRecord()
{
WS_SVisitRecord.CSoapHeader sh = new SalesTrack3.WS_SVisitRecord.CSoapHeader();
sh.ClientDomainName = Environment.UserDomainName;
sh.ClientUserName = Environment.UserName;
sh.Time = DateTime.Now;
sh.ClientPassword = CSystem.getPWD(sh.Time);
sh.id = CSystem.getSID();
CSoapHeaderValue = sh;
UseDefaultCredentials = true;
}
}
...全文
321 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbbbbb888888 2008-12-03
  • 打赏
  • 举报
回复
Ctrl+C ,Ctrl+V
wt_sanlian 2008-12-03
  • 打赏
  • 举报
回复
嘿嘿,这段代码是少不了,但对于这些类的 客户程序应当简单多了,可以很方便的进行隔离!
soaringbird 2008-12-03
  • 打赏
  • 举报
回复
这模式那模式的,能少得了那些重复代码吗?倒是多了不该多的垃圾类。
Tiger_ldy 2008-12-03
  • 打赏
  • 举报
回复
有那个必要吗?
tmd456 2008-12-03
  • 打赏
  • 举报
回复
纪成
wartim 2008-12-03
  • 打赏
  • 举报
回复
完整例子
namespace WindowsApplication21
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

((I)new A()).setm("1");
((I)new A()).setn(1);

((I)new B()).setm("2");
((I)new B()).setn(2);
}
}

interface I
{
void setm(string M);
void setn(int N);
}

class A:I
{
string m;
int n;

public void setm(string M)
{
m = M;
}

public void setn(int N)
{
n = N;
}
}

class B : I
{
string m;
int n;

public void setm(string M)
{
m = M;
}

public void setn(int N)
{
n = N;
}
}
}
wt_sanlian 2008-12-03
  • 打赏
  • 举报
回复
适配器模式啊
wartim 2008-12-03
  • 打赏
  • 举报
回复
没必要把,重复的不会很多的么。。。如果非要弄,可以写一个interface(接口),让类都继承这个接口,然后定义一些方法,每个类都实现这些方法

interface I
{
public setm(string M);
public setn(string N);
}

class A
{
string m;
int n;
}

class B
{
string m;
int n;
}

((I)new A()).setm("1");
((I)new A()).setn(1);

((I)new B()).setm("2");
((I)new B()).setn(2);
7707 2008-12-03
  • 打赏
  • 举报
回复
给你个参考.


static List<T> SetAttributes<T>(List<T> list) where T : Permission
{
foreach (T t in list)
{
Dictionary<string, object> dictionary = (Dictionary<string, object>)Sunivo.Framework.Utility.BinarySerializer.Deserializer(t.PermissionBytes);
//填充属性

foreach (PropertyInfo info in t.GetType().GetProperties())
{
if (info.GetCustomAttributes(typeof(SunivoAttribute), false).Length == 0)
continue;

object value = info.GetValue(t, null);
if (info.GetSetMethod() == null || !dictionary.ContainsKey(info.Name))
continue;
info.GetSetMethod().Invoke(t, new object[] { dictionary[info.Name] });

}
...........
wangping_li 2008-12-03
  • 打赏
  • 举报
回复
既然分为不同的类,说明每个类都是一个独立的东西,可以把每个类看着不同的对象
这么一点点重复的东西也算不了什么,你说给每个属性都赋值,这些值保存吗?
如果要保存的话那你最后还不是得:
类名 对象=new 类名();
对象.属性=值;
vrhero 2008-12-03
  • 打赏
  • 举报
回复
人不能懒到这种程度...
soaringbird 2008-12-03
  • 打赏
  • 举报
回复
这么一点点重复的东西算得了什么
GTX280 2008-12-03
  • 打赏
  • 举报
回复
我的做法是定义了一些类,把这些字段复制过去
不知道有没有更好的办法
zhlei616 2008-12-03
  • 打赏
  • 举报
回复
是WebService端一个自定义的类,用于调用webservice时在soap头中存放一些身份验证的属性
继承自System.Web.Services.Protocols.SoapHeader
shaofei830927 2008-12-03
  • 打赏
  • 举报
回复
看不懂 帮忙顶
卧_槽 2008-12-03
  • 打赏
  • 举报
回复
CSoapHeader
是个什么东西?

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧