如何将函数泛型参数分配给强类型变量

本文关键字:分配 类型变量 参数 泛型 函数 | 更新日期: 2023-09-27 18:33:26

我有以下函数:

public override void LoadDataToControls<T>(T Id)
{
}

我想将Id参数分配给函数内部的 Guid 变量,我该如何实现?

这是抽象的基类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace BMS.Classes.Helpers
{
    public abstract class BasicPageFunctionsHelper : System.Web.UI.Page
    {
        public abstract void BindGrid();
        public abstract void ClearControls();
        public abstract void LoadDataToControls<T>(T ID);
        public abstract void EnableDisableControls(bool Enable);
        public abstract void SetPageStatus(EnumHelper.PageStatus PageStatus);
        public abstract bool ValidateInsert();
        public abstract bool ValidateUpdate();
        public abstract bool ValidateDelete();
    }
}

如何将函数泛型参数分配给强类型变量

我想将 Id 参数分配给 函数,我该如何实现?

如果我理解正确,那么:

Guid guid = Guid.Parse(Id.ToString());

或者使用 Guid.TryParse ,如果传递的类型不是 GUID,则不会给出异常。 喜欢:

Guid guid;
if (Guid.TryParse(Id.ToString(), out guid))
{
    //successfull parsing
}
else
{
    //not a guid
}

虽然,如果你的方法处理一个特定的类型,那么首先把它作为一个泛型并没有真正的用处。

编辑:如果要传递 GUID 类型的对象,则可以将其类型与类似is进行比较:

Guid guid;
if (Id is Guid)
{
    guid = (Guid)(object)Id;
}

(这在萨克蒂维尔的回答中已经提到@Sriram)

为了完整起见,这可能是更好的方法。 定义具有所需功能的接口,然后在泛型定义中要求该接口。 这将强制编程器和编译器确保 100% 类型安全的运行时代码。

public interface IASGUID
{
   Guid GetGuid();
}

public override void LoadDataToControls<T>(T Id) Where T : IASGUID
{
  // then auto type-checked -- no run-time error possible.
  Guid guid = Id.GetGuid(); 
}
如果我

理解正确,那么您需要将 Id 分配给Guid

试试这个。请注意,这涉及装箱/拆箱可能不是最佳方法。但是,如果您不关心性能,这应该会有所帮助。

public override void LoadDataToControls<T>(T Id)
{
    if(id is Guid)
    {
        Guid guid = (Guid)(object)id;
    }
}