限制因素和隐含的运营商

时间:2011-02-22 05:58:49

标签: c# operators constraints

我有三个班级A,B和C, 有些属性属于所有三个类,有些属性不是

public class A
{ 
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
    public int xxx {get; set}   // only in class A
    public int yyy{get; set}    // only in class A
    ... 
}

public class B
{ 
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
    public int aaa {get; set} // only in class B
    public int bbb {get; set} // only in class B
    ... 
}

public class C
{ 
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
    public int kkk {get; set} // only in class C
    public int ppp {get; set} // only in class C
    ...
}

我想调用类XYZ的执行方法......

public class XYZ
{
    public override Execute<T>() where T: Generic_T, new()
    { 
      T abc = new T();
      ...
      Debug.WriteLine(abc.Firstname + ”, “ + abc.Lastname + “, “ + abc.ID);
    }
}

...所有三个类,如:

XYZ x1 = new XYZ();
XYZ.Execute<A>();

XYZ x2 = new XYZ();
XYZ.Execute<B>();

XYZ x3 = new XYZ();
XYZ.Execute<C>();

我的想法不起作用:

public class Generic_T
{
    public static implicit operator A(Generic_T x)
    { 
        return (A)x.MemberwiseClone();
    }
}

错误在哪里?

提前致谢!

2 个答案:

答案 0 :(得分:2)

错误:

  1. 什么是CloneMemberwise()
  2. 如果你的意思是MemberwiseClone(),你就不能在那里打电话。这是protected成员。
  3. 您无法调用某个类型的属性。在此处:T.FirstnameT.Lastname
  4. Debug,而不是Degub
  5. 您不会将值/引用传递给Execute方法。
  6. A,B或C都不是Generic_T派生的,因此对Execute方法的约束会失败。
  7. 班级名称不以()结尾。您已经重新编辑了class A()
  8. A或任何类无法自动转换为Generic_T
  9. 您应该使用继承,我怀疑Generic_T应该是基类。
  10. 您没有具体问题
  11. 可能的建议:

    public abstract class Generic_T
    {
        public string Firstname {get; set;}
        public string  Lastname {get; set;}
        public int ID {get; set;}
    }
    
    public class A : Generic_T
    { 
        public int xxx {get; set}   // only in class A
        public int yyy{get; set}    // only in class A
        ... 
    }
    
    public class B : Generic_T
    { 
        public int aaa {get; set}   // only in class B
        public int bbb {get; set} // only in class B
        ... 
    }
    
    public class C : Generic_T
    { 
        public int kkk {get; set}   // only in class C
        public int ppp {get; set} // only in class C
        ...
    }
    

    此外,没有理由将任何派生类转换为Generic_T,因为它们已经是Generic_T的实例。

    所有这些信息通常都在C#/ .NET的大多数介绍性文章中进行了解释。不了解它们会让你的生活变得悲惨。

答案 1 :(得分:0)

不知道为什么在代码中需要Generic_T。 要强制执行工作,您需要实现以下接口

interface IFoo 
{
   int ID {get; set;}
   string LastName {get; set;}
   string FirstName {get; set;}
}

然后你的execute方法将如下所示:

public override Execute<T>(T obj) where T: new(), IFoo
{ 
    Debug.WriteLine(obj.Firstname + ”, “ + obj.Lastname + “, “ + obj.ID);
}