请考虑以下代码段:
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
}
}
我想访问T
函数中的Log()
,但问题是我无法更改构造函数签名,例如:FooRepository(ISessionFactory sessionFactory, T entity)
。我不知道如何将其传递到Log()
。
还有其他办法吗?
更新:
我想访问T
内的Log()
实例。
更新2 :
嗯,抱歉这个烂摊子。我不习惯所有这些东西。我会在这里澄清一些事情。所以我的存储库在服务层调用:BarRepository.Update(entityToPersist); // Bar inherits from Foo
在Update
方法中,调用事件AfterWriteOperation
:
if (AfterWriteOperation != null)
AfterWriteOperation(this, e);
对于所有这些事情,我只是放弃了上述案例中e
是我的实体的简单事实,所以我可以通过这种方式将其传递给Log:
(sender, local) => this.Log(local); // I will rename local to entity
将其放入方法中。
答案 0 :(得分:4)
与
void Log(T 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
}
}
}
成功#stdin #stdout 0.01s 33480KB
关于你的其他陈述:
我想访问
T
内的Log()
实例。
T
本身没有实例。您可以使用Type
代表T
typeof(T)
对象。
答案 1 :(得分:1)
如果您想获得有关此类型的信息,例如在Name
中Methods
,Interfaces
,...
,typeof(T
然后使用log
) - 就像.GetType()
对实例的调用一样并将返回泛型参数的类型。
如果您想使用该类型的任何实例,则必须
a)创建实例(Activator.CreateInstance(typeof(T)))
或
b)通过构造函数传递实例,然后传递给this.Log(passedInstance)
调用。