C# 访问通用对象参数
考虑以下代码段:C# 访问通用对象参数,c#,asp.net,asp.net-mvc,generics,C#,Asp.net,Asp.net Mvc,Generics,考虑以下代码段: public class FooRepository<T> : BaseRepository<T> where T : EntityBase { public FooRepository(ISessionFactory sessionFactory) : base(sessionFactory) { this.AfterWriteOperation += (sender, local) =>
public class FooRepository<T> : BaseRepository<T>
where T : EntityBase
{
public FooRepository(ISessionFactory sessionFactory)
: base(sessionFactory)
{
this.AfterWriteOperation += (sender, local) => this.Log();
}
public void Log()
{
// I want to access T here
}
}
在Update
方法中,调用事件AfterWriteOperation
:
if (AfterWriteOperation != null)
AfterWriteOperation(this, e);
有了所有这些,我就忽略了一个简单的事实,即在上述情况下,e
是我的实体,因此我可以通过以下方式将其传递给日志:
(sender, local) => this.Log(local); // I will rename local to entity
如果您想获取有关类型的信息,例如
名称
,方法
,接口
,…
,那么在日志
中使用类型(T
)-这与.GetType()
调用实例类似,并将返回泛型参数的类型。
如果要使用该类型的任何实例,必须
a) 创建一个实例(Activator.CreateInstance(typeof(T))
或
b) 通过构造函数将实例传递给
this.Log(passedInstance)
调用。如果您想获取有关类型的信息,例如名称
,方法
,接口
,..
则在日志
中使用类型(T
)-这与.GetType()类似
调用实例并返回泛型参数的类型。
如果要使用该类型的任何实例,必须
a) 创建一个实例(Activator.CreateInstance(typeof(T))
或
b) 通过构造函数将实例传递给this.Log(passedInstance)
调用
类似于void Log(T entity)
并在方法内部使用它
:
使用系统;
命名空间工作4me
{
公共接口ISessionFactory{}
公共类EntityBase{}
公共类BaseRepository,其中T:EntityBase{}
公共类FooRepository:BaseRepository
其中T:EntityBase
{
公共FooRepository(ISessionFactory sessionFactory)
{
}
公共作废日志(T实体)
{
}
}
公开课考试
{
公共静态void Main()
{
//你的密码在这里
}
}
}
Success#stdin#stdout 0.01s 33480KB
关于你的其他声明:
我想访问Log()
中的T
实例
T
本身没有实例。您可以使用typeof(T)
获得表示T
的Type
对象
类似于void Log(T entity)
并在方法内部使用它
:
使用系统;
命名空间工作4me
{
公共接口ISessionFactory{}
公共类EntityBase{}
公共类BaseRepository,其中T:EntityBase{}
公共类FooRepository:BaseRepository
其中T:EntityBase
{
公共FooRepository(ISessionFactory sessionFactory)
{
}
公共作废日志(T实体)
{
}
}
公开课考试
{
公共静态void Main()
{
//你的密码在这里
}
}
}
Success#stdin#stdout 0.01s 33480KB
关于你的其他声明:
我想访问Log()
中的T
实例
T
本身没有实例。您可以使用typeof(T)
获得表示T
的Type
对象访问T
意味着什么<代码>类型(T)?否则只需使用它。…。@ta.speot.就像void Log(T entity)
一样,并在方法内部使用它。那么,写下它吧?为什么这不是一个选择?您是否尝试过这样声明Log
?取一个T
?@LasseV.Karlsen类型的参数,你的意思是只使用它?当我尝试获取时,类型参数名称此时无效
@LasseV.Karlsen我不知道如何在构造函数内部访问它以将其传递给Log()
。访问t
意味着什么<代码>类型(T)?否则只需使用它。…。@ta.speot.就像void Log(T entity)
一样,并在方法内部使用它。那么,写下它吧?为什么这不是一个选择?您是否尝试过这样声明Log
?取一个T
?@LasseV.Karlsen类型的参数,你的意思是只使用它?当我尝试获取时,类型参数名称此时无效
@LasseV.Karlsen我不知道如何在构造函数中访问它以将其传递给Log()
。奇怪的是,它部分工作。我得到了带有b选项的实例,但是is的所有属性都是null
值。而您传递的实例在这些属性上都有值?我看不出有问题。您不能在未定义的类中触发事件-实际上不需要该事件,因为日志也是同一类层次结构的一部分?对我来说,你的代码工作……奇怪的是,它部分工作。我得到了带有b选项的实例,但是is的所有属性都是null
值。而您传递的实例在这些属性上都有值?我看不出有问题。您不能在未定义的类中触发事件-实际上不需要该事件,因为日志也是同一类层次结构的一部分?对我来说,你的代码很有效……好吧,现在我可以得到这个实例了,因为这一直都是我的错。谢谢你抽出时间。这个问题应该结束了。好吧,现在我可以得到这个例子了,因为这一直都是我的错。谢谢你抽出时间。这个问题应该结束了。
(sender, local) => this.Log(local); // I will rename local to entity
using System;
namespace Works4Me
{
public interface ISessionFactory { }
public class EntityBase { }
public class BaseRepository<T> where T : EntityBase { }
public class FooRepository<T> : BaseRepository<T>
where T : EntityBase
{
public FooRepository(ISessionFactory sessionFactory)
{
}
public void Log(T entity)
{
}
}
public class Test
{
public static void Main()
{
// your code goes here
}
}
}