C# 我可以让相同的方法在浮点和/或向量2上运行其逻辑吗?

C# 我可以让相同的方法在浮点和/或向量2上运行其逻辑吗?,c#,.net,C#,.net,我有一个类,它的方法有两个值,一个是当前值,一个是目标值。该方法使用这些函数进行一系列数学计算,并返回传入的相同类型的值。它还更新类上相同类型的某些属性 但是,现在我有这个方法的两个副本(以及它更新的类上的每个属性),一个用于float,一个用于Vector2,将来可能需要更多。但是,逻辑是完全相同的(操作是相同的、基本的,并且不关心类型) 有没有办法使这个类不关心传递给它的方法/作为它的属性的值的类型,只要它是float或Vector2?我尝试了泛型方法,但似乎你只能比较泛型而不能进行加法或乘

我有一个类,它的方法有两个值,一个是当前值,一个是目标值。该方法使用这些函数进行一系列数学计算,并返回传入的相同类型的值。它还更新类上相同类型的某些属性

但是,现在我有这个方法的两个副本(以及它更新的类上的每个属性),一个用于float,一个用于Vector2,将来可能需要更多。但是,逻辑是完全相同的(操作是相同的、基本的,并且不关心类型)

有没有办法使这个类不关心传递给它的方法/作为它的属性的值的类型,只要它是float或Vector2?我尝试了泛型方法,但似乎你只能比较泛型而不能进行加法或乘法等

我可以有两个不同的类,但我不想把方程放在两个地方

public float Response { get { return 0.2f; } }
public float Damping { get { return 0.5f; } }
public Vector2 VectorVelocity { get; set; }
public float FloatVelocity { get; set; }

public Vector2 Move(Vector2 current, Vector2 target) 
{   
    Vector2 delta;
    delta = target - current;
    this.VectorVelocity += delta * this.Response;

    current += this.VectorVelocity;
    this.VectorVelocity *= this.Damping;

    return current;
}

public float Move(float current, float target) 
{   
    float delta;
    delta = target - current;
    this.FloatVelocity += delta * this.Response;

    current += this.FloatVelocity;
    this.FloatVelocity *= this.Damping;

    return current;
}

这里有一种通用方法,要求您为各种操作传递委托

public T Move<T>(T current, T target, 
    Func<T, T, T> subtract, 
    Func<T, T, T> add,
    Func<T, float, T> multiplyByFloat,
    Action<T> setVelocity,
    Func<T> getVelocity,
    ) 
{   
    T delta = subtract(target, current);
    setVelocity(add(getVelocity(), multiplyByFloat(delta, this.Response));    
    current = add(current, getVelocity());
    setVelocity(multiplyByFloat(getVelocity(), this.Damping);    
    return current;
}
您可以采用这种方法将forumula保留在一个位置,并且仍然有覆盖,为您发出特定的调用,因为每次都必须放入所有这些代理将是痛苦的


我还想声明,对于给定的示例,我不确定这是否值得,但是如果公式更复杂,并且您需要处理3种或更多类型,那么这种方法可能是可行的,但正如您所看到的,公式更难以这种方式阅读。

您应该使用泛型类型@PaviełKraskoŭski不,他们不应该这样做,因为你无法生成一个通用的2个浮点参数或一个向量2one@CamiloTerevinto我懂了。因此,您可以创建两个重载方法,其中一个带有Vector2参数的方法将调用另一个带有两个浮点参数的方法。@PaviełKraskoŭski泛型在这里不起作用,因为运算符。没有允许它们的约束。
dynamic
可以在这里工作,尽管它也有自己的一系列问题,比如将编译时检查推到运行时,通常效率较低。此外,结果将是动态的,您可能需要进行一些铸造。非常感谢!即使我最终没有实现它(正如您所说,易读性是一个因素),这种方法也确实帮助我更好地理解泛型和委托。
var result = Move(current, target, 
    (a,b) => a - b, 
    (a,b) => a + b,
    (a,b) => a * b,
    v => this.FloatVelocity = v,
    () => this.FloatVelocity);