按位置访问泛型类型的属性

时间:2016-09-01 10:01:20

标签: c# generics

我需要使用属性位置或任何其他类似方式访问Generic类型的属性。

示例:

class model
{
    int intValue;
    string stringValue;

    public model(int a,string b){
    this.intValue = a;
    this.stringValue= b;
    }
}



public class baseClass<T>
{   
    public string value;

    public void process(T param)
    {
      value =  param.Getproperty[0].ToString();
    }

}

public class derivedClass : baseClass<model>
{
     Console.WriteLine("Converted value:" +process(new model(1,"test")));
    //Do something
}    

我的基类实际上是一个通用库,它执行一些简单的常见任务。

3 个答案:

答案 0 :(得分:1)

您需要定义一个公共接口,当前接口设置为Object,因此无法访问任何不是Object成员的任何内容,这是通过where关键字

完成的。

这可以使用实际接口

明确完成
public interface IIndexedProperty
{
    object Getproperty(int index);
}

public class model:IIndexedProperty
{
    int intValue;
    string stringValue;
    public object Getproperty(int index)
    {
        //select property by index
    }
}

public class baseClass<T>
    where T:IIndexedProperty
{   
    public T item;
    item.Getproperty(0); // access intValue
    item.Getproperty(1); // access stringValue
}

另一种选择是使用模型作为您的界面

public class model
{
    int intValue;
    string stringValue;
}

public void baseClass<T>
    where T:model
{   
    public T item;

    item.intValue; // access intValue
    item.stringValue; // access stringValue
}

最后一个选项是反射

typeof(T).GetProperties();

答案 1 :(得分:1)

我可以建议另一种方法吗?

如果您总是有2个问题

interface TwoProperties {
  object GetProperty1();
  object GetProperty2();
}

class Model : TwoProperties {
  int intValue;
  stringStringValue;

  public override object GetProperty1() {
    return intValue;
  }

  public override object GetProperty2() {
    return stringValue;
  }
}

然后使用someModel.GetProperty1()作为例子。

如果您拥有未知数量的属性:

interface SomeProperties {
  object[] GetProperties();
}

class Model : SomeProperties {
  int intValue;
  stringStringValue;

  public override object[] GetProperties() {
    return new object[] { intValue, stringValue };
  }
}

然后使用someModel.GetProperties()[0],例如。

答案 2 :(得分:0)

您可以实施property indexer

示例代码:

public class TestIndexer
{
    public string x;
    public int y;
    public object this[int i]
    {
        get
        {
            switch (i)
            {
                case 1:
                    return y;
                case 2:
                    return x;
                default:
                    return "";
                // return the property you want based on index i
            }
        }
    }
}

TestIndexer t = new TestIndexer();
t.y = 22;
object indexValue = t[1]; //22