C#,快速泛型问题

时间:2009-10-12 16:44:10

标签: c#

我需要创建一个只有2个属性(左侧和顶部)的快速类,然后我会在集合中调用它们。

是否有一种快速创建类结构的方法,而无需使用泛型实际创建强类型类?

提前致谢

更好的是,framwework是否具有内置类型,而不仅仅是以整数值存储左,上,右,下坐标?

5 个答案:

答案 0 :(得分:9)

自动属性有助于快速实现

public class Position<T> where T: struct
{
  public T Top { get; set; }
  public T Left { get; set; }
}

或者您可能想要查看System.Drawing命名空间中的Point或Rectangle类。

答案 1 :(得分:6)

我认为你正在寻找System.Drawing.Rectangle(这是一个结构,顺便说一下不是一个类; System.Windows.Shapes中有一个类,但那是不同的。)创建一个新通用没有意义当你想要的东西已经在框架中时输入。

答案 2 :(得分:2)

你这样做的原因是什么?为什么不创建类?

如果你真的需要推迟,你可以创建一个界面:

public interface IMyDeferredClass
{
    int MethodReturningInt(int parameter);
    int IntegerProperty { get; set; }
    int this[int index] { get; }
    event EventHandler SomeEvent;
}

您可以编程到IMyDefferedClass,但最终需要一个类来实现该接口:

public class MyDeferredClass : IMyDeferredClass
{
    public int MethodReturningInt(int parameter)
    {
        return 0;
    }

    public int IntegerProperty
    {
        get { return 0; }
        set {  }
    }

    public int this[int index]
    {
        get { return 0; }
    }

    public event EventHandler SomeEvent;
}

答案 3 :(得分:1)

不好意思。匿名类只能在相同的方法中使用,而不使用Jon的一些 horible hack。 (见评论)

答案 4 :(得分:1)

在C#3.0中,你需要使用反射。

这两个建议都会产生很大的性能开销。

static void Main(string[] args)
{
    var obj = new { Name = "Matt" };
    var val = DoWork(obj); // val == "Matt"
}

static object DoWork(object input)
{
    /* 
       if you make another anonymous type that matches the structure above
       the compiler will reuse the generated class.  But you have no way to 
       cast between types.
    */
    var inputType = input.GetType();
    var pi = inputType.GetProperty("Name");
    var value = pi.GetValue(input, null);
    return value;
}

在C#4.0中你可以使用“动态”类型

static object DoWork(dynamic input)
{
    return input.Name;
}
有趣的Hack由Jon Skeet

指出
static object DoWork(object input)
{
    var casted = input.Cast(new { Name = "" });
    return casted.Name;
}

public static class Tools
{
    public static T Cast<T>(this object target, T example)
    {
        return (T)target;
    }
}