1

我认为标题可能是错误的..哈哈不确定..无论如何..

我有3种不同的数据类型..

public class data1
{
    public Color color;
    public int len;
    public DrawingVisual dv;
    Other vars...
}
public class data2
{
    public Color color;
    public int len;
    public DrawingVisual dv;
    Other vars different from data1 vars...
}

ETC...

我怎样才能创建一个函数来传递这些,然后在函数中获取我需要的变量..示例..

void Something(var data)
{
    switch (typeof(data))
    {
         case data1:

         break;
         case data1:

         break;
    }
}

这显然不会起作用..但这只是一个例子..

我怎么能做到这一点?

谢谢

4

3 回答 3

7

考虑创建类层次结构,并将方法Something移动到该层次结构。基类:

public abstract class Data
{
    public Color color;
    public int len;
    public DrawingVisual dv;

    public abstract void Something();
}

以及两个派生类Data1Data2

public class Data1 : Data
{
    // Other vars...

    public override void Something()
    {
        // Use base class data and other vars
    }
}

public class Data2 : Data
{
    // Other vars different from Data1 vars

    public override void Something()
    {
        // different implementation
    }
}

现在,当您拥有这些类的实例时,您可以简单地对每个项目调用Something,而无需尝试确定其类型。每个项目都将具有完成操作所需的所有变量:

List<Data> items = // get list of Data1 and Data2
foreach(Data data in items)
    data.DoSomething();
于 2013-07-25T14:07:26.930 回答
1

您可以使用object而不是var

void Something(object data)
{
    if(typeof(data) == data1.GetType())
    {

    }
    else
    if(typeof(data) == data2.GetType())
    {

    } 
}

您的类似乎具有可以使用继承的共同属性。创建一个基本抽象类并继承它的剩余部分。

public abstract class Data
{
    public Color color;
    public int len;
    public DrawingVisual dv;

    public abstract void Something();
}

public class Data1 : Data
{
      //Addition methods go here
}

public class Data2 : Data
{
      //Addition methods go here
}

作为附加说明,我假设您将使用遵循属性和类等的命名约定。

于 2013-07-25T14:01:04.717 回答
1

首先,您可能需要重新考虑使用公共字段并改用公共属性。您可能会考虑两种选择。

实现共享接口

考虑到您的两个类都具有相同的属性,您可以有一个接口:

public interface IData
{
    Color color {get;set;}
    int len {get;set;}
    DrawingVisual dv {get;set;}
}

public interface Data1
{
    public Color color {get;set;}
    public int len {get;set;}
    public DrawingVisual dv {get;set;}
}

public interface Data2
{
    public Color color {get;set;}
    public int len {get;set;}
    public DrawingVisual dv {get;set;}
}

void Something(IData data)
{
   // use the properties defined in the IData interface
}

Something(new Data1());
Something(new Data2());

使用方法重载

void Something(data1 data)
{
    // Do something specific using data1 class
}

void Something(data2 data)
{
    // Do something specific using data2 class
}

Something(new data1());
Something(new data2());

我建议使用第一个选项。

于 2013-07-25T14:08:32.070 回答