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

时间:2013-10-01 18:03:22

标签: c# generics

我有以下功能:

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();
    }
}

3 个答案:

答案 0 :(得分:3)

  

我想将Id参数分配给内部的Guid变量   功能,我怎么能实现这个?

如果我理解正确的话:

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 Sakthivel answer已经提到过这个问题

答案 1 :(得分:0)

为了完成,这可能是更好的方法。定义具有所需功能的接口,然后在通用定义中要求该接口。这将迫使程序员和编译器确保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(); 

}

答案 2 :(得分:-1)

如果我理解正确,那么您需要将ID分配给Guid

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

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